私はbashとrsyncを使ってウェブサイトのバックアップを作成して保存しています。dd-mm-yyyy
日付フォルダ ""に保存します。
私はx日(現在は2日ですが長くなる予定)より古いフォルダを削除するために、次の方法を試してきました。
find /path/to/files -type d -mtime +2 -name [0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] -exec rm -rf {} \; -prune
上記はうまくいきましたが、ここで明らかに間違ったことをしていないことをもう一度確認したかったのです。
次に、フォルダが見つかったか、フォルダが削除されたか、削除されたフォルダが何であるかを確認したいと思います。
これが正しいことを確認するために、次のように単純なものかどうか疑問に思います。
if find /path/to/files -type d -mtime +2 -name [0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] -exec rm -rf {} \; -prune; then
...
fi
しかし、削除されたフォルダパスを出力する方法がわかりません。
答え1
find
ファイルが見つかるかどうかに関係なく正常に終了します。成功は、有効なコマンドライン引数と入力/出力エラーがないと定義されます。いくつかのファイルが見つかったかどうかを知りたい場合は、何かを印刷して出力が空でないことを確認してください。
find
見つかったファイルの名前を印刷するには、-print
アクションとして挿入します。複数のタスクをリンクできます(たとえば-print
、1つずつ配置する-exec
だけです)。-prune
find /path/to/files -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -print -exec rm -rf {} \; -prune
に渡されるパターンの周りには引用符が必要です-name
。それ以外の場合、現在のディレクトリに一致するファイルがある場合、シェルはパターンを表示find
する前にパターンを展開します。
各バックアップの最上位ディレクトリ名だけでなく、削除された各ファイルの名前を印刷したい場合は、Linuxを使用する場合(より正確にはGNU coreutilsを使用している場合)に変更できます。-v
フラグは次のとおりです。に渡されましたrm
。
/path/to/files
公開したコマンドは、最上位レベルだけでなく、どこでも一致するディレクトリを繰り返し探します。それがあなたの意図であるかどうかはわかりません。たとえば、最新のバックアップが表示されます。最上位ディレクトリだけを一致させたい場合は、最も簡単な方法はを渡すことです-maxdepth 1
。そうする必要はありません-prune
。
find /path/to/files -maxdepth 1 -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -print -exec rm -rf {} \;
または、シェル一致ディレクトリ名を指定してfind
一致する前に適用して何も繰り返さないように指示できます-prune
。
find /path/to/files/[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] -prune -type d -mtime +2 -print -exec rm -rf {} \;
ただし、パターンに一致するファイルが存在しない場合、または一致するファイルが多すぎて結合名がコマンドラインの最大長を超えると、エラーが発生します。この-maxdepth
方法にはこれらの欠点はない。
削除されたファイルを記録するには、出力をファイルにリダイレクトします。
{
echo "# Deletions on $(date)"
find /path/to/files -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -print -exec rm -rf {} \; -prune
echo
} >>backup-deletions.log
間違ったアイテムを削除するのが心配な場合は、削除した内容を記録すると、遅すぎた場合にのみ知ることができます。まず、コンテンツをごみ箱に移動し、ごみ箱を空にして段階的に削除することができます。
# Move things to trash. Use whatever criteria you want.
find /path/to/files -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -exec mv {} /path/to/trash \; -prune
# Delete directories from the trash can if they were moved more than
# a week ago.
find /path/to/trash -mindepth 1 -maxdepth 1 -ctime +7 -exec rm -rf {} \;