96

I need to change the timestamp of about 5000 files.

Typing touch file1.txt, touch file2.txt will take me forever.

Is there a way to do something in the lines of touch -R *?

4
  • 1
    did you mean this touch file{1..3}.txt ? Feb 1, 2015 at 9:57
  • 3
    You didn't specify which shell you are using, but with zsh, touch **/* is convenient. Feb 1, 2015 at 22:36
  • @Marc Glisse Keep in mind that the argument list easily gets too long.
    – user986805
    Oct 8, 2019 at 7:11
  • In bash you need to set globstar before you can use touch **
    – user986805
    Oct 8, 2019 at 7:33

2 Answers 2

151

You can use find command to find all your files and execute touch on every found file using -exec

find . -type f -exec touch {} +

If you want to filter your result only for text files, you can use

find . -type f -name "*.txt" -exec touch {} +
5
  • 6
    And for a dry run, just leave out the -exec touch {} + part, and it'll print to your terminal what it would have affected.
    – Alex
    Feb 1, 2015 at 20:11
  • What if I only want to change the access time, not the modification time? Should it be "find -type f -exec touch -a {} +"?
    – weeo
    Apr 18, 2018 at 9:05
  • @giltsl g_p's answer works verbatim for me
    – Scruffy
    Jan 18, 2019 at 2:00
  • 5
    It's worth noting that the man page (Ubuntu 19.10) for find suggests it is more secure to use -execdir rather than -exec as -execdir runs each command from the directory in which the find result is located. It also says that when invoked from a shell, "[the curly brace pair] should be quoted (for example, '{}') to protect it from interpretation by shells". Jan 24, 2020 at 21:55
  • 2
    Leaving out -type f, it will also affect directories: find . -execdir touch '{}' + (also incorporated other improvements as mentioned above) Apr 22, 2022 at 16:39
0

g_p's answer makes the timestamp "now" but if for instance you forgot the cp -p parameter and need to replace timestamps with their originals recursively without recopying all the files. Here is what worked for me:

find /Destination -exec bash -c 'touch -r "${0/Destination/Source}" "$0"' {} \;

This assumes a duplicate file/ folder tree of Source: /Source and Destination: /Destination

  1. find searches the Destination for all files & dirs (which need timestamps) and -exec ... {} runs a command for each result.
  2. bash -c ' ... ' executes a shell command using bash.
  3. $0 holds the find result.
  4. touch -r {timestamped_file} {file_to_stamp} uses a bash replace command ${string/search/replace} to set timestamp source appropriately.
  5. the Source and Destination directories are quoted to handle dirs with spaces.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .