1. ホーム
  2. unix

[解決済み] コマンドライン:検索結果をrmにパイプする

2022-04-26 18:08:07

質問

15日以上前のSQLファイルを削除するコマンドを作ろうとしています。

findの部分はうまくいっていますが、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 's 出力 の入力に find . あなたが欲しいのは、出力された find として 引数 から 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 は標準入力にファイル名を期待しない。現在あなたがしていることは、それらを逆向きにパイプすることです。