
touch
Linuxのコマンドラインユーティリティと次の例を見ています。地図時間、アクセスまたは変更タイムスタンプを指定された時刻、現在時刻、または参照ファイルに変更する方法を理解します。
しかし、私は次のことをしたいと思います。私のファイルの相対的な期間(相対的な)には、失いたくない貴重な情報が含まれています。しかし、実際よりも数ヶ月若く見えるようにするには、フォルダ内のすべてのファイルが(再帰的に)必要です。したがって、各ファイルは自分自身を参照して時間を追加できますが、フォルダツリー内のすべてのファイルに適用できます。これを行うための良い方法はありますか?
#!/bin/bash
FILES=$(find $HIGHEST_FOLDER -type f -name *.*)
for f in $FILES
do
touch -ram f -F 7776000 f
# bumping access and modification timestamps by 3 months?
done
または、find -exec
提案どおりに使用することをお勧めしますこれ答え? (このフォルダには多くのファイルがあります。)では、どうすればいいですか?
答え1
Linuxシステムを使用しているtouch
場合、または少なくともGNUとGNUがあると仮定すると、date
次のことができます(bashではzsh
同じですが必須ではありませんshopt globstar
)。
$ shopt globstar
$ for f in **; do
touch -d "$(date -d "$(stat -c '%y' "$f") +3 months")" "$f"
done
ただし、隠しファイルは無視されます。これらも一致させるには、上記のshopt -s dotglob
コマンドの前に実行します。
説明する
shopt -s globstar
:これはglobstar
bashのオプションを設定します。つまり、**
すべてのファイルとゼロ以上のディレクトリとサブディレクトリが一致します。shopt -s dotglob
:(*
および**
)この名前で始まるファイルとも一致させます.
。for f in **; do ...; done
:すべてのファイルを繰り返します。とディレクトリ、別の名前で保存してください$f
。stat -c '%y' "$f"
:現在のファイルまたはディレクトリの現在のタイムスタンプです。date -d $(...) +3 months
:与えられた文字列から3ヶ月後の日付を印刷します(この場合、文字列はコマンドのstat
出力です$f
)。
要約すると、上記のコマンドは現在のフォルダ(すべてのサブディレクトリを含む)にあるすべてのファイルまたはディレクトリの変更日を見つけ、その日付を今後3か月に設定します。
答え2
質問の説明を見ると、最後のファイルの変更時刻を確認して3ヶ月を追加できるツールを探しているようです。 ++一部のシェル算術評価を使用してこれを実行できますstat
。touch
たとえば、file
タイムスタンプに90日を追加するには、次のように書くことができます。
touch -d "@$(( $(stat -c '%Y' file) + 90*24*3600 ))" file
file
その後、必要なすべてを繰り返します。
答え3
私は-exec
find -a onelinerを使用します。
find $HIGHEST_FOLDER -type f -name '*.*' -exec touch -d "$(date -d "$(stat -c '%y' {}) +3 months")" {} \;
reference *.*
、そうでなければ、find
現在のディレクトリからファイル名を取得し、失敗します。
最後に、これを強制するには\;
バックスラッシュとセミコロンを指定する必要があります。現在見つかったファイル-exec
です。{}
find
GNUタッチに切り替えていない-F
ため、例は機能しません。また、いくつかの構文の問題があります。
上記のforループでfを$ fに変更する必要があります。
touch [...] $f
それ以外の場合は、現在のディレクトリで名前付きファイルを見つけてそのf
日付をx回変更します。ここでxはです$HIGHEST_FOLDER
。
サブシェル(ループの前)を使用する場合は、サブシェルで設定したことを$(...)
確認する必要があります。$HIGHEST_FOLDER