私は特定のファイルを見つけて別のフォルダに移動するためにスクリプトでこのコマンドを使用していますが、移動したファイルのログを生成する必要があります。
find $1* -prune -name "*.$2" -mtime +$3 -exec mv {} $4 \;
ログを生成するには、コマンドに何を追加する必要がありますか?
答え1
注文、
find $1* -prune -name "*.$2" -mtime +$3 -exec mv {} $4 \;
まず、次のように書く必要があります。
find "$1"* -prune -name "*.$2" -mtime +"$3" -exec mv {} "$4" \;
そうしないと、名前にスペースが含まれているディレクトリやファイルには使用できなくなります。
このコマンドで実際に移動した項目のパス名を出力するには、最後の項目を追加するだけですmv
。-print
find "$1"* -prune -name "*.$2" -mtime +"$3" -exec mv {} "$4" \; -print
これにより、指定された宛先に正常に移動されたすべてのファイル(またはディレクトリ)のパス名が出力されます"$4"
。
答え2
-execの前に-printを追加すると、移動する前にファイル名を印刷できます。
答え3
次のコマンドを使用して、ログファイルに書き込む-exec
他のブロックを追加できます。echo
find $1* -prune -name "*.$2" -mtime +$3 -exec mv {} $4 \; -exec echo mv {} $4 >> /path/to/log \;
より少ない情報が必要な場合は、最後の-exec
ブロックを修正してください。-exec echo {} >> /path/to/log \;
エラー履歴
コマンドが成功したかどうかを記録したい場合は、mv
コマンドの標準エラーをログファイルにパイプすることもできます。最初のものが-exec
最初に動作するという保証はありませんので、-exec
この場合は1つを使用します。ここでは構文は少し複雑です。
find $1* -prune -name "*.$2" -mtime +$3 -exec mv {} $4 \; -exec sh -c 'echo mv $1 $2 >> /path/to/log; mv $1 $2 2>> /path/to/log' . {} $4 \;
いくつかのコメント
find "$1"* …
正確なユースケースはよくわかりませんが、ファイル名にスペースなどがある場合は変数を引用することをお勧めします。その中で。
第二に、 。-execdir
より優先します-exec
。からman find
:
-execジョブを使用すると回避できないセキュリティ上の問題があるため、-execdirオプションを使用する必要があります。
mv -vの代わりに
または Steeldriver の言葉によるとコメント、あなたのバージョンがmv
verbose-v
オプションをサポートしている場合は、元の-exec
ブロックを次のように変更できます。
-exec mv -v {} $4 >> /path/to/log \;
これにより、同様の出力が得られますrenamed 'foo' -> 'bar'
。