X日以上経過した大量のファイルを削除しようとしています。
今、私はそれをするためのスクリプトがあります
find /path/to/files* -mtime +10 -exec rm {} \;
しかし、これでサブディレクトリも削除されます。たくさんのフォルダがありますが、それらを保管し、そのフォルダ内の10日以上経過したファイルを削除したいと思います。
これを行う方法はありますか?
type
オプションfind
は、ファイルのみを選択するためのtype
オプションを受け入れます。
find /path/to/files -type f -mtime +10 -delete
何を削除するのかを表示するには-delete
を省略し、確認したら先に進んでfullコマンドを実行します。
これはファイルでのみ実行され、ディレクトリでは実行されません。逆には-type d
を使用して、引数に一致するディレクトリのみを一覧表示します。
将来必要になる可能性のあるオプションが他にもあるので、man find
を読むことをお勧めします。たとえば、-maxdepth
では、見つかったアイテムを特定の深さに制限することしかできません。 -maxdepth 0
はサブディレクトリに再帰しませんでした。
rm
だけではフォルダを削除することはできないので、コマンドがどのようにフォルダを削除したのでしょうか。そのためにはrm -r
が必要です。
また、/path/to/files*
は紛らわしいです。 /path/to/files/
を意味しましたか、それともワイルドカードを使用していくつかのファイル名およびフォルダ名に展開することを期待していましたか?
セミコロンをバックスラッシュで保護するのと同じように、置換されたファイル/ディレクトリ名がシェルによって解釈されないようにするため、{}
を一重引用符で囲みます(つまり、'{}'
)。
前の回答と同じように(両方とも+1)、秘訣は-type f
述語を使うことです。
-exec rm '{}'
の代わりに-delete
述語を使うこともできます。しかし、そうしないでください。 -exec rm '{}'
を使って、あなたが最初に-exec echo rm '{}'
をすることができる(そしてそうするべきです)これが本当にあなたが望むものであることを確かめるために。その後、echo
を付けずにコマンドを再実行してください。
-delete
を使用するのはより速いです(各ファイルのための余分なfork()
とexecve()
がない)、しかしこれは-delete
が条件としても働くので危険です。
# delete *.tmp files
find . -type f -name '*.tmp' -delete
しかし、引数を交換するだけなら:
# delete ALL files
find . -type f -name '*.tmp' -delete
大量のファイルに対して高速に動作させるためにfind
とrm
が必要な場合は、UNIXのfind ... | xargs ... rm
を参照してください。
あなたは簡単にfindコマンドでこれをすることができます
$ find -type f
結果がタイプファイルになるように制限します。
特にファイル名やフォルダ名に改行やスペースが含まれている場合は、上記のスクリプトや他のスクリプトを使用してこの問題を解決するのに苦労しました。
ついにtmpreaperに遭遇しました、そしてそれは今のところ私達のためにかなりよく働きました。
tmpreaper -t 5d ~/Downloads
tmpreaper --protect '*.c' -t 5h ~/my_prg
元のソース リンク
Testのような機能があり、ディレクトリを再帰的にチェックして一覧表示します。削除中にシンボリックリンク、ファイルまたはディレクトリ、さらに特定のパターンの保護モードを削除する機能
コマンドを高速化するには、'+'
の代わりに\;
を使用してください。
find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'
ファイルが見つかるたびにではなく、最後に一度だけrm
を実行します。
(コマンドラインの長さの制限のために本当にたくさんのファイルがある場合は、rm
が数回実行される可能性がありますが、これはまだ-delete
を使用するのと同じくらい高速です)
rm -f find /path/to/files -type file -mtime -5
これにより、5日以内に変更されたファイルが削除されます。
rm -f find /path/to/files -type file -mtime +5
これにより、5日前に変更されたファイルが削除されます。
検索の前に、5の後に `を使用してください。