web-dev-qa-db-ja.com

コマンドライン:検索結果をrmにパイピング

私は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

私は何を間違えていますか?

125
jerrygarciuh

実際には、rmの-​​outputfindの入力にパイプしています。必要なのは、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に直接パイピングすることはオプションではないことに注意してください。現在行っているのは、それらを逆方向にパイプすることです。

241
Lev Levitsky
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;

15日より古い/usr/www/bar/htdocsのファイルを選択して削除します。

24
Suresh

もう1つの簡単な方法は、locateコマンドを使用することです。次に、結果をxargsにパイプします。

例えば、

locate file | xargs rm
2
Gautam

* .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 {} \;
1
Nick Little