我有很多大文件夹,其中有数千个文件,我想将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 中的每个目录,并仅更改每个文件和子目录的访问时间。