web-dev-qa-db-ja.com

ファイルとディレクトリの変更時刻を再帰的に変更するためのスクリプト

何千ものファイルを含む大きなフォルダがたくさんあり、touchを使用して、変更時間を「元の時間」+3時間に設定したいと思います。

スーパーユーザーの同様のスレッドからこのスクリプトを取得しました。

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

ですから、私が必要としているのは、固定ディレクトリではなく任意のディレクトリで動作させることであり(したがって、別の場所でスクリプトを実行するたびにスクリプトを編集する必要はありません)、スクリプトを見つけて編集できるようにすることです。ファイルを再帰的に。

Linuxの使用経験はほとんどなく、bashスクリプトを設定するのはこれが初めてですが、プログラミング(主にC)については1つか2つは知っています。

助けてくれてありがとうございました:)

4
Achus

使用する 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
6
yaegashi

正解は次のとおりです。

"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の両方内のすべてのディレクトリを検索し、すべてのファイルとサブディレクトリのアクセス時間のみを変更します。

2
Facundo Victor