何千ものファイルを含む大きなフォルダがたくさんあり、touch
を使用して、変更時間を「元の時間」+3時間に設定したいと思います。
スーパーユーザーの同様のスレッドからこのスクリプトを取得しました。
#!/bin/sh
for i in all/*; do
touch -r "$i" -d '+3 hour' "$i"
done
ですから、私が必要としているのは、固定ディレクトリではなく任意のディレクトリで動作させることであり(したがって、別の場所でスクリプトを実行するたびにスクリプトを編集する必要はありません)、スクリプトを見つけて編集できるようにすることです。ファイルを再帰的に。
Linuxの使用経験はほとんどなく、bashスクリプトを設定するのはこれが初めてですが、プログラミング(主にC)については1つか2つは知っています。
助けてくれてありがとうございました:)
使用する find -exec
再帰的touch
の場合、dirsが処理するためのコマンドライン引数。
#!/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.
シェルスクリプトの句読点として解釈されないように、中括弧を一重引用符で囲むことを忘れないでください。セミコロンは、バックスラッシュを使用して同様に保護されますが、その場合も単一引用符を使用できます。
最後に、「yaegashi」のようなシェルスクリプトでそれを使用するには、次のように述べています。
#!/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の両方内のすべてのディレクトリを検索し、すべてのファイルとサブディレクトリのアクセス時間のみを変更します。