web-dev-qa-db-ja.com

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

この質問は、私が here に投稿した最初の質問のフェーズIIの一種です。

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

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

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

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

56
Evster

BASHでは、末尾にスラッシュを使用できます(Ithinkこれは、どのPOSIXシェルでも機能するはずです)。

rm -R -- */

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

書き込み不可のファイルを削除するときに確認を求められないようにするには、-fオプションを追加します。

デフォルトでは、隠しディレクトリ(名前が.で始まるディレクトリ)はそのまま残されることに注意してください。

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

zshを使用する場合、glob修飾子を使用して、タイプがディレクトリのファイルのみを選択することをお勧めします。

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

または:

rm -R -- *(-/)

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

bash、AT&T kshyashまたはzshを使用すると、次のことができます。

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

末尾の/を削除します。

69
peterph

ワイルドカードの方法に加えて、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します。

13
derobert

これらの提案の一部、特にrm -R -- */用のスクリプトを作成し、それを/ usr/local/binフォルダーに保持することをお勧めします。または〜/ .bashrcファイルにaliasを作成します。 soなので、コマンドを誤入力してシス​​テムを壊すのは簡単です-1文字でも文字の順序でも破滅的な結果を招く可能性があります-これは、このタスクを実行するたびに異なるオプションと引数を入力する必要がある場合よりも、やや堅牢なソリューションとして機能します。

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

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

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

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

4
ILMostro_7

最初にディレクトリを一覧表示してから削除する必要があります。通常のファイルを妨害することなく、ls -d * /はサブディレクトリのみを一覧表示し、rmでそれをパイプ処理すると、ディレクトリと内容が削除され、ルーズファイルはそのまま保持されます。

このコマンドでうまくいくはずです。

ls -d  */ | xargs rm -rf
1
Ankit Marothi

rm -rf <directory name>。できます。 rm <directory name>は、サブディレクトリのそれぞれを手動で削除する必要があるサブ質問の数につながるだけです。だが、 rm -rfは、サブディレクトリとともにディレクトリ全体を一度に削除するのに役立ちます。

0
Riya Melvin