web-dev-qa-db-ja.com

特定のディレクトリの「最終更新日」を一括変換するにはどうすればよいですか?

たとえば、時間オフセットが数時間ずれていることを知っているとします(おそらく、システムクロックが特定の時間に数時間進んでいたためです)。その場合、特定のディレクトリ内のすべてのファイルの「最終更新日」をどのように一括変更しますか?

ファイルが異なれば、変更時間を異なる値に変更する必要があることに注意してください。

2
InquilineKea

ファイルの変更時間に相対オフセットを適用する場合は、touch(1)stat(1)を組み合わせて適用できます。 touchは相対時間をサポートしますが、ファイルの現在の時刻ではなく、現在の相対時刻です。代わりに、statを使用して現在の変更時刻を取得し、オフセットを適用できます。

たとえば、ファイルの変更時間に-2時間のオフセットを適用するには、次のようにします。

touch -m -d @$(( $(stat -c %Y file.txt) - 7200 )) file.txt

stat -c %Y file.txtは、エポックからの秒数としてfile.txtの変更時間を取得します。 bash 算術展開を使用すると、計算を実行できます。この場合、7200秒(2時間)を減算します。 -mでタッチして変更時刻を変更し、-dで日付を指定すると、変更時刻を計算されたものに設定できます。 @は、指定された時間がエポックからの秒数であることを示す時間形式指定子です。

これをシェルスクリプトに入れると、findまたはxargsから呼び出すことができ、findを使用して変更するファイルを選択できます。

#!/bin/bash
for file ; do
    touch -m -d @$(( $(stat -c %Y "$file") - 7200 )) "$file"
done

これにより、引数として渡されたすべてのファイルの変更時刻に変更が適用されます。

6
camh

1つのファイルを手動で適切なタイミングに変更します(touch ... TEMPLATEを使用)。

次に、そのファイルを参照して残りを変更します(touch -r TEMPLATE TARGETを使用)。

0
Nils