ファイルを再帰的に削除する


140

MacからLinuxサーバーにファイルを移動した後に取得する厄介な._および.DS_Storeファイルを削除する解決策はありますか?

開始ディレクトリを指定してそれを手放しますか?/ var / www / html /のように...


それはIMO重複していないですが、あなたはこれを見てみる必要があります。stackoverflow.com/questions/1280429/...
Grundlefleck

あなたが求めているものではありませんが。私は、これは、よりよい解決策であると主張します:unix.stackexchange.com/questions/9665/...
ヴィクトル

回答:


169

ディレクトリに移動し、次を使用します。

find . -name ".DS_Store" -print0 | xargs -0 rm -rf
find . -name "._*" -print0 | xargs -0 rm -rf

テストされていません。最初にxargsなしで試してください!

最初にディレクトリに変更する代わりに、検索後のピリオドをディレクトリに置き換えることができます。

find /dir/here ...

2
彼の質問がそれを要求しなかったのは知っていますが、思い出せません:あなたの例はスペースを含むファイル名を処理しますか?
Grundlefleck、2010年

4
はい、それがprint0および-0 to xargsの目的です。通常はスペースを正しく処理しませんが、print0を使用すると、行末にヌル文字を含むファイル名が出力されます。-0を指定したxargは、空白を含まずにxargsへのフルパスを渡すために使用します。 rmコマンドの2番目または3番目のパラメーターが使用されている場合、これは本当に悪い可能性があります。
X-Istence 2010年

7
@X:新しいfindutilsは-deleteアクションをサポートしているため、これを短縮できます。@JT:これはで再帰的に検索します.。存在するファイルとサブディレクトリの数によって異なります...それらのアップロードを単に禁止することはできませんか?
10

1
使い方-r(再帰)あなたはどのディレクトリを削除したくないので、フラグはこの場合にはお勧めしません...
ダニエル・ゾハル

2
@IlmariKaronen:良い点。うではありませんcommand rm(、より直接的である)よりよい解決策になりますか?(「直接」とは、当面の問題だけを扱い、それにより不要な副作用が発生する可能性が低くなり、コードを保守する必要のある人にとって説明がわかりやすくなることを意味します。後で)
iconoclast 2014年


86

新しいfindutilsはをサポートしている-deleteので、

find . -name ".DS_Store" -delete

追加-printして、削除のリストも取得します。

最新のPOSIXシステムがあれば、コマンドは機能します。少なくとも、OS X 10.8では動作し、macOS 10.12(Mojave)でテストした他のユーザーでも動作します。

@ X-Istenceの投稿へのコメントで、@ ephemientの功績をたたえます(独自の回答を保証するのに十分役立つと考えられていました)。


1
OSX 10.6でも動作します。
hoss

3
最もクリーンでシンプルなソリューション、+ 1!
リミスト2014

6
@OneOfOne:私のコメントが言うように、私はこれを@ ephemientから取得しました。bashの初心者として、私はあなたの(おそらくより正確な)ソリューションが読みにくく、使いにくいことに気づきました。これらは機能的には同じかもしれませんが、この構文によりわかりやすくなります。
ラットトレイ2014年

1
「。」findデフォルトでは現在の作業ディレクトリに再帰するため、必要ありません。
トムラッセル

プログラムの新しいバージョンでは、ディレクトリは省略される場合があり、現在の作業ディレクトリwikipediaを意味します。.macOS 10.12(Sierra)ではまだ必要です。
Dem Pilafian、

18

簡単なコマンド:

rm `find ./ -name '.DS_Store'` -rf
rm `find ./ -name '._'` -rf

幸運を!


1
これはうまくいきます。rm -i しかし、注意してください、私はこれを使用しました./ -name '* py'` -rf , which did NOT prompt me to delete files. you will need to take it on the end (i.e. -rfi`)。バックアップスクリプトを神に感謝します。
ryanjdillon 2013

1
:あまりにも多くのファイルのエラーでこの休憩がある場合-bash: /bin/rm: Argument list too long
ヴィクトル

12
cd /var/www/html && find . -name '.DS_Store' -print0 | xargs -0 rm
cd /var/www/html && find . -name '._*' -print0 | xargs -0 rm

2
"rm"に "-r"がないため、これはこの特定のタスクに必要ではないので、私はこの方が好きです。
lotsoffreetime 2011

6

bashの代わりにzshに切り替えることができます。これにより、**を使用して、ディレクトリツリーの任意の場所にあるファイルを照合できます。

$ rm /var/www/html/**/_* /var/www/html/**/.DS_Store

次のように組み合わせることもできます。

$ rm /var/www/html/**/(_*|.DS_Store)

Zshには他にもbashにはない機能がたくさんありますが、その機能だけでも切り替えの価値があります。ほとんどの(おそらくすべての)Linuxディストリビューションだけでなく、cygwinやOS Xでも使用できます。

詳細については、zshサイトをご覧ください。


1
考えられる問題:xargsを使用しないため、コマンドライン引数の長さ制限に遭遇する可能性があります。また、Bash 4もサポート**します:shopt -s globstar
ephemient

4
find . -name "FILE-TO-FIND"-exec rm -rf {} \;

見つかったファイルごとにexecを使用するのは高速ではありません。findがそれらを出力し、xargsを使用してrmを1回呼び出す方が高速です。
X-Istence 2010年

3
あなたが持っている場合は、findサポートされていることを、それは、+:xargsのに似ているfind . -name "FILE-TO-FIND" -exec rm -rf {} +(また、あなたの前にスペースが不足している- -exec
追って通知があるまで一時停止。

3
私たちの日はxargsがありませんでした。そして、私たちは学校に歩いて、両方の上り坂
マーティンBeckett

3

「Thumbs.db」を再帰的に削除する例。

find . -iname "Thumbs.db" -print0 | xargs -0 rm -rf

検証:

find . -iname "Thumbs.db"

これにより、現在のパス内に「Thumbs.db」を持つエントリが表示されなくなります。


回答に削除対象のリストが印刷されていることを確認し、代わりに(理由はありますが)代わりに使用xargsしたい理由を説明してください。print0exec
Josh Habdas


2

Bash 4.0 ++を使用している場合

#!/bin/bash
shopt -s globstar
for file in /var/www/html/**/.DS_Store /var/www/html/**/._ 
do
 echo rm "$file"
done

2
ファイルごとにrmの新しいコピーを実行するのは無駄です。
X-Istence 2010年

2
@ X-Istenceの時期尚早な最適化は無駄です
Lucina

独創性と最近のbashイノベーションの使用に賛成。
Josh Habdas

1

注意すべきいくつかの事柄:

「-delete」は再帰的ではありません。したがって、.TemporaryItems(フォルダー)にファイルがある場合、コマンドは失敗します。

Macによって作成されたこれらの厄介なファイルがたくさんあります:.DS_Store ._。DS_Store .TemporaryItems .apdisk

この1つのコマンドは、それらすべてに対処します。複数の一致に対してfindを繰り返し実行することによる保存。

find /home/foo \( -name '.DS_Store' -or -name '._.DS_Store' -or -name '._*' -or -name '.TemporaryItems' -or -name '.apdisk' \) -exec rm -rf {} \;

0

これも機能します:

sudo rm -rf 2018-03-*

ここでは、2018-03-(その他)という形式の名前の削除ファイル

単純にする


誰かがコマンドの前に付けるタイミングを説明したり、回答のコンテキストでsudoどのようにrm機能するかについての情報を提供したりしません。
Josh Habdas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.