递归更改文件和目录修改时间的脚本

递归更改文件和目录修改时间的脚本

我有很多大文件夹,其中有数千个文件,我想将touch它们的修改时间设置为“原始时间”+3 小时。

我从超级用户的类似线程中得到了这个脚本:

#!/bin/sh
for i in all/*; do
  touch -r "$i" -d '+3 hour' "$i"
done

所以我猜我需要的是让它在任何目录而不是固定目录中工作(这样我就不需要每次我想在不同的地方运行它时都编辑脚本)并让它能够查找和编辑递归文件。

我使用 Linux 的经验很少,这是我第一次设置 bash 脚本,尽管我对编程略知一二(主要是 C 语言)。

非常感谢大家的帮助:)

答案1

find -exec用于递归,使用touch命令行参数来处理目录。

#!/bin/sh
for i in "$@"; do
    find "$i" -type f -exec touch -r {} -d '+3 hour' {} \;
done

你可以像这样运行它:

./script.sh /path/to/dir1 /path/to/dir2

答案2

正确且完整的答案是:

修改仅访问时间与“触碰“命令,您必须使用”-A"参数,否则该命令也会修改修改时间。例如添加3小时:

touch -a -r test_file -d '+3 hour' test_file

从男人的触摸:

Update the access and modification times of each FILE to the current time.

-a                     change only the access time

-r, --reference=FILE   use this files times instead of current time.

-d, --date=STRING      parse STRING and use it instead of current time

因此,文件的访问时间等于旧访问时间加上 3 小时。并且修改时间将保持不变。您可以通过以下方式验证这一点:

stat test_file

最后,仅修改整个目录的访问时间及其文件和子目录,您可以使用“寻找“命令遍历目录并使用”-执行”参数对每个文件和目录执行“touch”(只是不要使用“-F型“参数,它不会影响目录)。

find dir_test -exec touch -a -r '{}' -d '+3 hours' '{}' \;

从人身上发现:

-type c     File is of type c:

            d      directory

            f      regular file

对于-exec:

-exec command ;
          Execute command; true if 0 status is returned.  All following arguments to find are taken to be arguments to the command until an argument consisting  of  ';'  is  encoun-
          tered.  The string '{}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone,
          as in some versions of find.  Both of these constructions might need to be escaped (with a '\') or quoted to protect them from expansion by the shell.   See  the  EXAMPLES
          section  for examples of the use of the -exec option.  The specified command is run once for each matched file.  The command is executed in the starting directory.   There
          are unavoidable security problems surrounding use of the -exec action; you should use the -execdir option instead.

只需记住将大括号括在单引号中,以防止它们被解释为 shell 脚本标点符号。分号同样通过使用反斜杠进行保护,尽管在这种情况下也可以使用单引号。

最后,将其使用到像“yaegashi”这样的 shell 脚本中:

#!/bin/sh
for i in "$@"; do
    find "$i" -exec touch -a -r '{}' -d '+3 hours' '{}' \;
done

并像“yaegashi”所说的那样运行它:

./script.sh /path/to/dir1 /path/to/dir2

它将搜索 dir1 和 dir2 中的每个目录,并仅更改每个文件和子目录的访问时间。

相关内容