Shell-Script
用於遞歸更改文件和目錄的修改時間的腳本
我有許多包含數千個文件的大文件夾,我想
touch
將它們的修改時間設置為“原始時間”+3 小時。我從超級使用者的類似執行緒中得到了這個腳本:
#!/bin/sh for i in all/*; do touch -r "$i" -d '+3 hour' "$i" done
所以我猜我需要的是讓它在任何目錄而不是固定目錄中工作(所以每次我想在不同的地方執行它時我都不需要編輯腳本)並讓它能夠找到和編輯遞歸文件。
我幾乎沒有使用 Linux 的經驗,這是我第一次設置 bash 腳本,儘管我對程式(主要是 C 語言)了解一兩件事。
非常感謝大家的幫助:)
用於
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
正確而完整的答案是:
只用“ touch ”命令修改訪問時間,必須使用“ -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
最後,要修改僅對整個目錄及其文件和子目錄的訪問時間,可以使用“ find ”命令遍歷目錄並使用“ -exec ”參數對每個文件和目錄執行“touch”(只是不要過濾帶有“ -type 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 中的每個目錄,並且只更改每個文件和子目錄的訪問時間。