すべてのサブフォルダから「ターゲット」フォルダを削除します。

すべてのサブフォルダから「ターゲット」フォルダを削除します。

targetすべてのサブフォルダの1つのフォルダを削除する必要があります。

答え1

そのようなディレクトリが数千を超えないことがわかっている場合は、次のコマンド設定とシェルオプションをtarget使用できます。globstardotglobbash

shopt -s globstar dotglob

その後、使用

rm -rf ./**/target/

targetこれにより、現在のディレクトリまたはその下に呼び出されたすべてのディレクトリが削除されます。末尾のスラッシュは非常に重要です。そうしないと、パターンがディレクトリではなくコンテンツと一致する可能性があるためです。

この**モードはシェルオプションを設定することで有効になり、サブディレクトリglobstarと「再帰的に」一致します。これも設定されているので、隠しサブディレクトリの下に呼び出されたディレクトリdotglobも探しますtarget(そうfindなります)。

macOSでは基本 bashシェルオプションをサポートするには古すぎるため、以下を使用してglobstar最新バージョンをインストールする必要があります。bash自分で作った、またはzsh(現在新しいmacOSユーザーアカウントのデフォルトシェル)に切り替えます。

を使用すると、zsh次のコマンドを使用してこれを実行できます。

rm -rf ./**/target(/D)

これは(/D)、「ディレクトリのみが一致し、隠されたディレクトリを含む」ことを意味します。 globは**デフォルトで有効になっていますzsh


そしてfind

find . -depth -type d -name target -exec rm -rf {} +

targetその後、現在のディレクトリまたはその下にあるすべてのディレクトリを見つけて、1rm -rf回の呼び出しでできるだけ多くのディレクトリを削除します。この-depthオプションはfind深度優先検索を実行します(削除したばかりのディレクトリを検索しないことを願っています)。

shこれはシェルを使用する場合、またはこのような数千のディレクトリがある場合に**使用するコマンドです。

ディレクトリが多い場合でもtarget1つずつ削除できます。

for dirpath in ./**/target/; do
    rm -rf "$dirpath"
done

findただし、各ディレクトリに対して一度呼び出されるので、使用するよりも遅くなります。rm

答え2

編集する:

この質問に対するコメントによれば、コマンドの広範な機能を活用してパイプを完全にスキップするのが最善です(また、削除を要求するディレクトリを入力しないでくださいfind)。findrm

find . -type d -name target -prune -exec rm -r {} +

それはあなたに役立ちます。

満足のいく回答を投稿して申し訳ありません。あなたのフィードバックは非常に有益でした。


元の答え:

少しGoogleすべてのサブディレクトリを一覧表示そしてパイプをrmに:

find . -type d | grep -E '/target$' | xargs rm -r

動作する必要があります。find . -type d | grep -E '/target$'フォルダを削除する前に予想される結果が出ていることを確認してください!後悔するよりも保存する方が良いです。

関連情報