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


140

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

何が悪いのですか?

回答:


274

あなたが実際にパイピングされている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。あなたが現在行っていることは、それらを逆方向にパイプすることです。


1
ありがとう。私はマニュアルページを読み、そのフラグを試してみました。フルパスを渡していますが、「/ usr / www2 / bar / htdocs / foo / rsync / httpdocs / db_backups /:相対パスは潜在的に安全ではありません」を返しています。なぜか?
jerrygarciuh


ありがとう。私は投稿をうまくフォローしたかわかりませんが、それらのソリューションをエミュレートし、コマンドの最後に-deleteを置くと、mod時間に関係なくすべてのSQLファイルが削除されました...しかし警告はなかったので、それは進歩です...
jerrygarciuh

1
@jerrygarciuh痛い、価値のあるものが失われていないことを願っています... man言います: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.あなたが使用した他のオプションを考えると、それがどのように重要であるかはわかりませんが、それを試しましたか?
Lev Levitsky

いいえ、しませんでしたが、何も失われていません。これらのファイルは、それらが保存されている別のサーバーからrsyncされます。
jerrygarciuh

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

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


「名前の中にスペースがある」ので、受け入れられたものよりあなたの答えを好む。パイプよりも「-exec」コマンドで処理する方が適切です。ありがとう。
スリムアルイ


2

* .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 {} \;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.