bashのディレクトリを削除せずに、ディレクトリ内のすべてのファイルとサブディレクトリを削除するにはどうすればよいですか?


53

ディレクトリを削除せずに、ディレクトリ内のすべてのファイルとサブディレクトリを削除するコマンドはありますか?

たとえば、サブディレクトリ「1」、「2」、「3」を持つディレクトリ「dontDeleteMe」があり、各サブディレクトリにいくつかの写真がある場合、サブディレクトリ「1」、「2」、「3」を削除するにはどうすればよいですか親ディレクトリ「dontDeleteMe」を削除せずに、それらのすべてのファイル?

回答:


66

ディレクトリを削除せずにディレクトリのすべてを削除するは、次のように入力します。

rm -rfv dontDeleteMe/*

この/*部分は非常に重要です。の前にスペースを入れると、*現在のディレクトリ内のすべてのファイルが削除されます。

また、非常に慎重で遊んでもrm-rかつ*同じコマンド内のすべての。それらは悲惨な組み合わせになる可能性があります。

更新: さて、私はあなたが隠されているんならば/ [、EX先頭にドットを含むファイル名のファイルをドット実現し.hidden、これは無傷でそれらのファイルを残します]。

本当に、元の質問に対する最も簡単な解決策は次のとおりです。 rm -rfv dontDeleteMe && mkdir dontDeleteMe

find-exec方法は、xargs(以下の)のオプションまたはパイプを使用することです。

find dontDeleteMe/* -print0 | xargs -0 rm -rv


xargsの使用例はありますか?xargsとは何ですか?
-justingrif

@justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv ほとんどの場合、これはスペースに関係なく機能すると信じています。ただし、cdし/tmp/てテストディレクトリを作成し、試してみてください。:)
マット

:ああ、manページから 「 -ビルドと標準入力からコマンドラインを実行xargsの」
マット・

5
ディレクトリを作り直すことは、その内容を削除することとは異なります。たとえば、umaskディレクトリのアクセス許可の違い、所有者の違いなど。enzotibの答えは、元の構文の問題を解決します

3
これは良い答えではありません。*の使用は危険であり、「dotglob」のないドットファイルでは機能しません(以下を参照)。rm -rf dontDeleteMe && mkdir dontDeleteMedirが同じ許可/所有者で再作成されることを保証しません。代わりに、find dontDeleteMe/ -mindepth 1 -delete以下のバリアントのいずれかを使用してください。
ニルストートマン

27

rm -r ./*常に機能しない唯一の理由は、に一致しない隠しファイルやフォルダがある可能性があるためです*

このbash目的のために、*隠されたオブジェクトも含め、すべてを一致させるオプションを提供します。

cd dont-delete-me
shopt -s dotglob
rm -r ./*

dotglob上記のコマンドを実行したシェルを引き続き使用する場合は、デフォルト(未設定)状態にリセットすると便利です。

shopt -u dotglob 

あなたは多数のファイルがある場合、それはまた、働くことができない
Sを...

23

ターミナルを開く(Ctrl+ Alt+ T

find somedir -mindepth 1 -delete

これはsomedir、「隠された」ドットファイルを含むsomedir-mindepth 1、そのためにそれ自体を除外するすべてのファイルとディレクトリ、およびその(グランド)子に一致します-delete


AskUbuntuへようこそ!あなたの答えは元のポスターを潜在的に助けるかもしれませんが、これが彼/彼女を助けるために何をするかを説明する情報の欠如はあなたの答えを不完全にします。
おおいぼ

3
説明はありませんが、それでも最良の答えです。OSXでも動作します(もちろん、ターミナルを開く方法を除きます)。
-noamtm

6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

xdevデバイス境界内でのみファイルを削除するには、オプションを使用します。


GNU findにはがあり-deleteます。それを意味し-depth、覚えるのは簡単です-depth -exec rm -Rf {} \;
ニルストエットマン

4

(ターミナルで)「dontdelete」という名前のベースディレクトリを除くすべてのファイルとサブディレクトリを削除するには:

rm -rf dontdelete/*

これは隠しファイルを削除しないので、「すべてのファイル」は大胆すぎるステートメントである可能性があります。
ステファンヴァンデンアクカー

4

find-deleteフラグを使用できます。

find dontDeleteMe/* -delete

これ/*find、「dontDeleteMe」というフォルダー内のみを検索するよう指示するため重要です。

また、-deleteフラグがfindコマンドの最後にあることを確認してください。


1
このソリューションは、を有効にしない限り、隠しファイルを削除しませんdotglob。そうでなければ、-mindepth 1フラグオプションを使用することが、それを機能させる唯一の方法のようです。
ステファンヴァンデンアッカー

3
rm -rf  directory/{.*,/*}

言うこと:

で始まるすべてのファイルを削除します。「ディレクトリ」および他のすべてのファイルにも。

Neftasから親切に指摘されているように、このソリューションは安全ではありません!

より安全なソリューションは次のとおりです。

 rm -rf directory/!(.|..)

あなたも含めているので、このコマンドは、潜在的に、危険なことができ.、および..ディレクトリ。これはに変更{.*}することで回避{.??*}できますが、のように1文字のみの隠しファイルは削除しません.a
ステファンヴァンデンアッカー

これはどうですか?rm -rfディレクトリ/!(。| ..)
テベ

それは私が思いついたものよりもはるかに優れたソリューションのように見えます。回答を編集することをお勧めしますか?
ステファンヴァンデンアクカー

提案が受け入れられました)
テベ

1

なぜこれがそんなに複雑なのかわかりません、間違っているなら助けてください

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

それでおしまい


これには、現在のディレクトリも削除しようとするというわずかな欠陥があります。もちろん、呼び出しシェルの作業ディレクトリとして使用されているため、動作しません。
デビッドフォースター

1

さらに簡単な答えがあります。

  1. cd dontDeleteMe

  2. rm -rf *

基本的なシステム管理の講義時間:このような抜本的なコマンドを使用するときは、現在地に注意してください。

それだけでは言えません。rm -rf */ にいる間に誰かが注意を払わずに入力したため、箱を回収しなければなりませんでした。

* nixは、rootである場合、またはrootとしてsudoを実行している場合は、自分が何をしているかを知っていると想定します。そのため、実行する前に何をしているかを確認してください。

「rm」を発行する前に「cd」コマンドが機能することを確認する代替手段は、

cd dontDeleteMe && rm -rf *

6
これは危険な提案です。あなたが欲しいのは: cd dontDeleteMe && rm -rf *
イズカタ

@Izkataまたは、rmコマンドを発行する前に、cd操作が成功したことを確認してください。
エリアケイガン

1
@EliahKaganそれはまさに私のコードスニペットが行うことです
...-Izkata

実際、それはあなたが提案するものよりも多かれ少なかれ危険ではありません。&&が行うことは、2つのコマンドを連鎖させて同時に実行することです。rm -rf *を実行する前に停止して.lookする必要があるので、私の方法は実際に安全です。ダブルチェックを一時停止することは常に良いです。
user30619

5
@ user30619 &&オペレーターは、コマンドを連結するだけではありません。次のコマンドが実行される前に、各コマンドが成功する必要があります。cd何らかの理由(ディレクトリが存在しない、特権など)でコマンドが失敗した場合、コマンドはrm実行されません。もっと安全だと思います。
ean5533

0
  1. 私にとって最も簡単なこと-Windowsの専門家であるがubuntuの初心者
  2. ランチャーの[ファイル]アイコンをクリックします
  3. 削除するファイルとフォルダーがあるディレクトリに移動します
  4. ファイルの隣のウィンドウの空白領域を右クリックし、「ターミナルで開く」をクリックします-ファイルウィンドウは開いたままにします
  5. 端末ウィンドウが開き、見つけたフォルダーに「設定」されます
  6. 「dir」と入力して(タイプと言うときは引用符を無視します)、端末のEnterキーを押してファイルとフォルダーのリストを表示します-正しいフォルダーに「いる」ことを証明するだけです
  7. 「rm -rf *」と入力してEnterキーを押します
  8. システムを削除するフォルダ/ファイルのサイズに応じて一時停止します
  9. ターミナルプロンプトが戻ると、開いていたファイルウィンドウに「フォルダが空です」と表示されます。
  10. この方法で成功し、ファイルウィンドウとターミナルウィンドウのDirコマンドの結果の両方でファイル/フォルダーを見ることができました。
  11. また、ファイルウィンドウに現在空のフォルダが表示されていることも安心しました。特に、これらのファイルを探してゴミ箱フォルダを探していたためです。
  12. 回答を提出してくれた他の皆さんに感謝します-非常に有益でした

特にrm -rf *とにかく走ってしまうので、それはかなり複雑に思えます。
デビッドフォースター

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.