target
すべてのサブフォルダの1つのフォルダを削除する必要があります。
答え1
そのようなディレクトリが数千を超えないことがわかっている場合は、次のコマンド設定とシェルオプションをtarget
使用できます。globstar
dotglob
bash
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
これはシェルを使用する場合、またはこのような数千のディレクトリがある場合に**
使用するコマンドです。
ディレクトリが多い場合でもtarget
1つずつ削除できます。
for dirpath in ./**/target/; do
rm -rf "$dirpath"
done
find
ただし、各ディレクトリに対して一度呼び出されるので、使用するよりも遅くなります。rm
答え2
編集する:
この質問に対するコメントによれば、コマンドの広範な機能を活用してパイプを完全にスキップするのが最善です(また、削除を要求するディレクトリを入力しないでくださいfind
)。find
rm
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$'
フォルダを削除する前に予想される結果が出ていることを確認してください!後悔するよりも保存する方が良いです。