x日より古いファイルを大量に削除しようとしています。
今、私はそれを行うスクリプトを持っています
find /path/to/files* -mtime +10 -exec rm {} \;
ただし、これによりサブディレクトリも削除されます。たくさんのフォルダーがありますが、それらを保持し、そのフォルダー内の10日より古いファイルを削除したいと思います。
これを行う方法はありますか?
x日より古いファイルを大量に削除しようとしています。
今、私はそれを行うスクリプトを持っています
find /path/to/files* -mtime +10 -exec rm {} \;
ただし、これによりサブディレクトリも削除されます。たくさんのフォルダーがありますが、それらを保持し、そのフォルダー内の10日より古いファイルを削除したいと思います。
これを行う方法はありますか?
回答:
type
結果をフィルタリングするためのオプションfind
type
たとえば、ファイルのみを選択するオプションを受け入れます。
find /path/to/files -type f -mtime +10 -delete
アウトのままに-delete
、それは削除したいかを示すために、そしてあなたがそれを確認した後、先に行くと、完全なコマンドを実行します。
これはディレクトリではなくファイルでのみ実行されます。-type d
引数に一致するディレクトリのみをリストして、逆に使用します。
man find
将来必要になる可能性のあるオプションがさらにいくつかあるので、読みたいかもしれません。たとえば-maxdepth
、見つかったアイテムを特定の深さだけに制限できます。たとえば、-maxdepth 0
サブディレクトリに再帰しません。
フォルダーrm
のみを削除することはできないため、このコマンドはどのようにしてフォルダーを削除したのでしょうか。あなたはそれが必要でしょうrm -r
。
また、/path/to/files*
紛らわしいです。/path/to/files/
ワイルドカードが複数のファイル名とフォルダ名に展開されることを意味しているのですか、それとも期待していますか?
入れ{}
すなわち、一重引用符で'{}'
、我々はバックスラッシュでセミコロンを守るだけのように、シェルによって解釈される置換ファイル/ディレクトリ名を避けるために。
find /path/to/files* -type f -mtime +10
、それが何を出力するかを見てください。
-exec
最初に見つけたものを見てください。
-delete
引数を使用してfind
、すべてのファイルとフォルダーを削除できます。後者は空の場合のみです。-depth
つまり、深さ優先検索を意味します。
-mindepth 1
して親ディレクトリを除外する必要があります。
前の回答(両方とも+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
し、より高速に作業する必要がある場合は、find ... | xargs ... rm
UNIXのイディオムを確認してください。
特にファイルやフォルダー名に改行またはスペースが含まれている場合、上記のスクリプトと他のスクリプトを使用してこれを正しく行うのに苦労していました。
ついにtmpreaperにつまずき、これまでのところ私たちにとっては非常にうまく機能しています。
tmpreaper -t 5d ~/Downloads
tmpreaper --protect '*.c' -t 5h ~/my_prg
元のソースリンク
ディレクトリを再帰的にチェックしてリストするtestなどの機能があります。削除中に特定のパターンのシンボリックリンク、ファイルまたはディレクトリ、および保護モードを削除する機能