私は15日以上前のSQLファイルを削除するコマンドを実行しようとしています。
検索部分は機能していますが、rmは機能していません。
rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f \( -name '*.sql' \) -mtime +15
削除したいファイルのリストが表示されますが、それらは削除されません。パスは正しいです。
usage: rm [-f | -i] [-dIPRrvW] file ...
unlink file
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120601.backup.sql
...
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120610.backup.sql
私は何を間違えていますか?
実際には、rm
の-outputをfind
の入力にパイプしています。必要なのは、find
の出力をarguments to rm
として使用することです。
find -type f -name '*.sql' -mtime +15 | xargs rm
xargs
は、標準入力を別のプログラムの引数に「変換」するコマンドです。または、より正確にman
ページに配置するため、
標準入力からコマンドラインを構築して実行する
ファイル名に空白文字を含めることができる場合は、それを修正する必要があることに注意してください。
find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm
しかし実際には、find
にはこのためのショートカットがあります:-delete
オプション:
find -type f -name '*.sql' -mtime +15 -delete
man find
の次の警告に注意してください。
Warnings: Don't forget that the find command line is evaluated
as an expression, so putting -delete first will make find try to
delete everything below the starting points you specified. When
testing a find command line that you later intend to use with
-delete, you should explicitly specify -depth in order to avoid
later surprises. Because -delete implies -depth, you cannot
usefully use -Prune and -delete together.
追伸rm
は標準入力のファイル名を想定していないため、rm
に直接パイピングすることはオプションではないことに注意してください。現在行っているのは、それらを逆方向にパイプすることです。
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;
15日より古い/usr/www/bar/htdocs
のファイルを選択して削除します。
もう1つの簡単な方法は、locate
コマンドを使用することです。次に、結果をxargs
にパイプします。
例えば、
locate file | xargs rm
* .sqlバックアップファイルを含むディレクトリにいないと仮定します。
find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \;
上記の-vオプションは便利で、削除されるファイルが削除されるときに詳細に出力されます。
確実に削除するファイルを最初にリストするのが好きです。例えば:
find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;