web-dev-qa-db-ja.com

検索するフォルダーを「検索」で除外するにはどうすればよいですか?

次のコマンドを実行しています。

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

processingフォルダーの下のすべてのフォルダーを削除したい(処理フォルダーは削除しないでください)。

コマンドはprocessingフォルダーも削除しています。削除するスクリプトを制限するにはどうすればいいですかonlyそのフォルダーの下のフォルダー?

18
Elad Dotan

最も簡単な方法は、-mindepth 1を追加することです。これにより 最初の深さ階層をスキップ となり、親ディレクトリは除外されます。

また、rmへの追加の-exec呼び出しは必要ありません。空の場合は フォルダーを直接delete直接 できます。

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

空でない場合:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

怠惰な場合は、ワイルドカードを展開することもできます。 *にはデフォルトで現在のディレクトリが含まれていないため( dotglobが設定されていない場合 )、次のようにすることもできます。

find /var/www/html/content/processing/* -type d -mtime +1 -delete

ただし、これにも隠しフォルダは含まれません。これもdotglobオプションのためです。

32
slhck

問題は、findが他のディレクトリと共に現在のディレクトリ(。)を返すため、サブディレクトリだけでなく処理フォルダーも削除されることです。それを回避する簡単な方法は、オプションを追加することです

-not -name .

これにより、findは現在のディレクトリの出力を停止し、次に、それは削除されなくなります。

これは、処理ディレクトリ内でコマンドを実行している場合に機能し、絶対パスを使用しているという事実を考慮に入れます。

-not -name /var/www/html/content/processing

そしてコマンド全体は次のようになります:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;
4
Xenopathic

もう答えましたが、それでも私は別のアプローチを挙げたいと思います。

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

これにより、トップディレクトリ(およびサブディレクトリも)が除外され、その上に適用するコマンドをすべて適用できるようになります。

>>オプション:
-mindepth 1:ルートディレクトリを除外するには
-maxdepth 1:サブディレクトリの解析を回避します。 (問題のある特定のシナリオでは、これは必要ありません)。
-type d:ディレクトリタイプのみをリストします。このオプションは、mindepth maxdepthを使用した後で使用する必要があります。

1
prashant