162

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

私は何が間違っているのですか?

4

5 に答える 5

314

実際には、rm出力をの入力にパイプしています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.

PS標準入力でファイル名を期待しないため、直接パイプすることrmはオプションではないことに注意してください。rmあなたが現在していることは、それらを逆方向に配管することです。

于 2012-06-25T15:03:04.907 に答える
33
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;

/usr/www/bar/htdocs15日以上経過したファイルを選択して削除します。

于 2013-08-30T10:57:28.600 に答える
6

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

例えば、

locate file | xargs rm
于 2017-04-27T13:23:36.387 に答える
3

*.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 {} \;
于 2017-06-06T03:07:49.287 に答える
1

xargsを使用して引数を渡し、オプション-rd'\n'を使用して名前のスペースを無視します。

"${コマンド}"| xargs -rd'\ n'rm

読み取り専用ファイルも削除する場合は、-forceを含めます。

于 2021-05-17T23:09:12.440 に答える