findおよびmv統合コマンドのログを取得するには?

findおよびmv統合コマンドのログを取得するには?

私は特定のファイルを見つけて別のフォルダに移動するためにスクリプトでこのコマンドを使用していますが、移動したファイルのログを生成する必要があります。

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 の言葉によるとコメント、あなたのバージョンがmvverbose-vオプションをサポートしている場合は、元の-execブロックを次のように変更できます。

-exec mv -v {} $4 >> /path/to/log \;

これにより、同様の出力が得られますrenamed 'foo' -> 'bar'

関連情報