ディレクトリ内からすべてのサブディレクトリを削除するにはどうすればよいですか?


51

この質問は、私がここに投稿した最初の質問の第2段階です

サブディレクトリ、.zipファイル、およびサブディレクトリ内に含まれていないその他のランダムファイルの束を含むディレクトリがあります。

コマンドラインスクリプトを使用して、親ディレクトリ内のすべてのサブディレクトリを削除しますが、サブディレクトリに属さないすべてのzipファイルとルーズファイルを保持します。すべてのサブディレクトリにはコンテンツがあるため、-fコマンドで強制的に削除する必要があると思います。

したがって、基本的には、親ディレクトリ(または現在のディレクトリ)内を検索し、その中からすべてのフォルダーを削除しますが、フォルダーではない、またはフォルダーに含まれる他のすべてのコンテンツおよびファイルは保持します。

コマンドラインからアイテムを削除するには特別な注意が必要であることは理解していますが、リモートでバックアップするために必要な予防措置をすべて講じています。

回答:


62

BASHでは、(私は最後のスラッシュを使用することができると思う、それは任意のPOSIXシェルで動作するはずです):

rm -R -- */

--引数とオプションを分離し、ハイフンで始まるエントリを削除できることに注意してください。そうでない場合、シェルによる展開後、エントリ名はオプションとして解釈されますrm(他の多くのコマンドラインユーティリティでも同じです)。

-f書き込み不可のファイルを削除するときに確認のプロンプトを表示したくない場合は、オプションを追加します。

デフォルトでは、隠しディレクトリ(名前がで始まるディレクトリ.)はそのままになります。

重要な警告:の拡張に*/は、最終的にdirectoryタイプのファイルに解決されるシンボリックリンクも含まれます。また、rm実装に応じて、rm -R -- thelink/シンボリックリンクを削除するか、(ほとんどの場合)リンクされたディレクトリのコンテンツを再帰的に削除しますが、そのディレクトリ自体もシンボリックリンクも削除しません。

使用している場合はzsh、より良いアプローチは、使用することですグロブ修飾子をのみ型ディレクトリのファイルを選択するには:

rm -R -- *(/) # or *(D/) to include hidden ones

または:

rm -R -- *(-/)

ディレクトリへのシンボリックリンクを含めるため(ただし、今回は、展開に末尾/のs がないため、すべてのrm実装で削除されるのはシンボリックリンクのみです)。

ではbash、AT&T kshyashまたはzshあなたが行うことができます。

set -- */
rm -R -- "${@%/}"

末尾を削除し/ます。


綺麗な!これは完全に機能します。こんなに簡単だとは知りませんでした。-r対-Rについて詳しく説明し、それらのコマンドが何をするのでしょうか?どうもありがとう。
エブスター

-r-R--recursive「再帰的に削除ディレクトリとその内容」を意味同義語です。
ペテルフ

何を説明できますか?
両生類

6
また、言うことができますrm -R ./*/-それはまた、ハイフン名の問題を回避します。
l0b0

1
*と/の順序を変更しないように注意してください。rm -R-/ *は、あなたが起こりたくないかもしれない全く違うことをします:|
クリスオドニー

13

ワイルドカードの方法に加えて、findこれを行うために(少なくともGNU find)を使用することもできます。

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 rm -R

他のfind行と同様に、最初の部分(find -mindepth 1 -maxdepth 1 -type d)を実行して、削除されるディレクトリのリストを表示できます。

より安全なオプションは、次のようなことです。

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 mv -i -t ../to-rm
# or
mv -i -t ../to-rm */
# or
mv -i */ ../to-rm

いずれも../to-rm削除する代わりにすべてのものを移動します。あなたが望んでいたことを確認できrm -Rfます。


「CLI-ゴミ箱」のための+1 to-rmfindこれはうまく(エスケープ、他の面倒に加えて)ドットで始まるディレクトリを処理します。:)
ペテルフ

ヒントをありがとう。削除する前に別のディレクトリに移動するというアイデアが好きです。Mac OS Xのターミナル経由で作業していますが、-mindepthおよび-maxdepthコマンドを使用するには、何らかの種類のGNUパッケージをインストールする必要があると思いますか?
エブスター

@Evsterは、Mac OS X findがそれらをサポートしているかどうかはわかりません。fink(それはまだありますか?)が見つけるfindをインストールできると思います。または、それらを省略して、grepを使用して生成されたファイルリストをフィルタリングすることもできます。rmの代わりに、間違いなくmvオプションを使用してください。
デロベルト

4

これらの提案、特にのいくつかのスクリプトを作成rm -R -- */し、/ usr / local / binフォルダーに保存することをお勧めします。またはalias〜/ .bashrcファイルにを作成します。コマンドを誤って入力してシス​​テムを壊すのは非常に簡単です(1文字や文字の順序でも壊滅的な結果を招く可能性があるため)。これは、さまざまなオプションや引数を入力するよりも多少堅牢なソリューションになります。このタスクを実行するたびに。

また、意図しない削除を回避するための別のツールとして機能するスクリプトまたはコマンドに-i or --interactive=onceまたは-I or --interactive=alwaysオプションを含めることもできます。

さらに、derobertのような提案が最適です。スクリプトをファイル/ターミナルエディターにコピーして貼り付け、特定のニーズに合わせて調整すると、ファイル/ディレクトリが単一のディレクトリ(その内容を確認/検証できる)に移動されます。rm -rfコマンドを発行します。

別のオプションは、ファイルマネージャーなどのGUIアプリケーションを使用し、削除するすべての適用可能なファイル/フォルダーを選択することです。権限がない場合は、ディストリビューションのマニュアルページを確認してください。

最後に、フォルダーが空の場合(基本的に単純なファイル名)、rmdirコマンドを使用してフォルダーを削除できます。削除したいすべての項目に対して機能するわけではありませんが、「ハウスクリーニング」を実行したいときに便利です。**この-p --ignore-fail-on-non-emptyオプションを試してください。これにより、特定のサブディレクトリと空の「親」(それらが存在するディレクトリ)を削除できます。


これは、このコマンドを呼び出すことができる別のスクリプトを作成する上で非常に良い考えです。-iおよび-Iオプションが何をするのか正確に説明できますか?ありがとう!
エブスター

-Iオプションは、「Enter」を押した後、これを削除することを確認するために一度プロンプトを表示します(3つ以上のファイル/フォルダーが「選択」されている場合)。一方、-iオプションは各ファイルに対してプロンプトを発行します。「y」と「Enter」をタップするだけで確認できます。肯定応答以外は、削除プロセス中に特定のファイルがスキップされます。
ILMostro_7

1

最初にディレクトリをリストし、次にそれらを削除する必要があります。通常のファイルls -d * /を妨げることなく、サブディレクトリのみをリストし、rmでパイプするとディレクトリと内容が削除され、ルーズファイルはそのまま残ります。

このコマンドは仕事をするはずです、

ls -d  */ | xargs rm -rf

1
上の利点は何rm -rf -- */ですか?arg listの大きすぎるエラーを回避するには(組み込みprintf '%s\0' */ | xargs -r0 rm -rf --printfあり、組み込みではないシェルで)役立ちますが、追加の問題を除いてAFAICTを追加しません。lsls -d */ | xargs rm -rf
ステファンシャゼラス

1
@AnthonyGeoghegan、例えば" .."(space ..)と呼ばれるディレクトリがあった場合、はい、いくつかのls実装で親ディレクトリのコンテンツを削除します。また、スペースだけでなく、他の空白文字、改行、一重引用符、二重引用符、バックスラッシュ、およびで始まるファイル名でもあります-
ステファンシャゼラス

2
@Ankit、あなたが始めることができ mywiki.wooledge.org/ParsingLs
ステファンChazelas

1
@StéphaneChazelasの提案を完全に理解しprintfて、各名前がヌル文字で終了するリストを生成xargsし、-0オプションで処理できるようにする場合、回答を編集してバリエーションで更新することをお勧めします。あなたがそれを理解し、潜在的に存在する可能性のある特定のファイル名によって引き起こされる望ましくない動作をどのように防ぐかを学んだなら、彼はあなたが彼のコードスニペットを使用して喜んでいるとかなり確信しています。
アンソニーG-モニカの正義

1
を使用xargsすると、受け入れられた回答よりも1つの利点があります(現在のディレクトリに非常に多数のファイル/ディレクトリがある場合に機能します)。個人的には、特に他のユーザーから有益なフィードバックを得る場合、Stack Exchangeの質問に答えることが優れた学習体験であることがわかりました。
アンソニーG-モニカの正義

-1

rm -rf <directory name>。できます。入力するrm <directory name>だけで、各サブディレクトリを手動で削除する必要があるサブ質問が多数発生します。ただし、rm -rfディレクトリ全体とそのサブディレクトリを一度に削除するのに役立ちます。


5
OPは、現在のディレクトリの内容を保持するように要求しました。
スティーブン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.