ディレクトリからすべてのファイルを削除する方法は?


289

一番近いのは

# rm /path/to/directory/*.*

しかし、拡張子のないファイルでは機能しません...

回答:


340

Linuxは拡張機能を使用しません。名前に拡張子を付けるかどうかを決定するのは、ファイルの作成者次第です。Linuxは1バイト目を見て、どの種類のファイルを扱っているかを把握します。

ディレクトリ内のすべてを削除するには、次を使用します。

rm /path/to/directory/*

-rたとえば、次のオプションを使用できます。

rm -r /path/to/directory/*

また、コンテンツを削除するディレクトリ内のサブディレクトリ(およびそのすべてのコンテンツ)も削除します。そうしないと、ディレクトリを削除していないことを通知するエラーが表示されます。


13
実行shopt -s dotglob前に実行される隠しファイルも削除する場合rm (...)
-danjjl

7
*はall files;)を*.*意味.し、名前のどこかを含むすべてのファイルを意味します
-Rinzwind

10
@Rinzwind、より正確には、アスタリスクは「ゼロ以上の任意の文字」を意味します。つまり*a*、ゼロ個以上の文字とそれに続くゼロ個以上の文字を意味しますa。これは、ファイル名にマッチするhappyappleaまたはla
不機嫌なヤギ

7
@あなたはあまりにも簡単に感銘を受けていuser784637
barlop

1
必要なコマンドを次に示します
。rm-

168
  • すべてのコンテンツ(すべての内部フォルダーを含むを含むフォルダーを削除するに

    rm -rf /path/to/directory
    
  • フォルダー自体ではなく、フォルダーのすべての内容すべての内部フォルダーを含む)を削除するには:

    rm -rf /path/to/directory/*
    

    または

    rm -rf /path/to/directory/{*,.*}
    

    隠しファイル/ディレクトリも確実に削除したい場合。

  • フォルダ内からすべての「ファイル」を削除するには(内部フォルダを削除しない):

    rm -f /path/to/directory/{*,.*}
    


  • 警告:パスにスペースがある場合は、必ず引用符を使用してください。

    rm -rf /path/to the/directory/*
    

    2つの個別のrm -rf呼び出しに相当します。

    rm -rf /path/to
    rm -rf the/directory/*
    

    この問題を回避するには、'単一引用符'(シェル変数を展開しない)または"二重引用符"(シェル変数を展開する)を使用できます。

    rm -rf "/path/to the/directory/"*
    


どこ:

  • rm-「削除」の略
  • -f-「force」の略で、たとえば、アーカイブを削除する場合に確認/プロンプトを表示したくない場合に役立ちます。
  • -r-「再帰的」の略で、すべてのフォルダーを再帰的にたどってすべてを削除することを意味します。

8
これは、承認済みとマークされた回答以上に、より包括的で有用な回答であることがわかりました。
インスピレーション

2
rm -rf /path/to/directory/*たとえば、フォルダ内の隠しファイルを削除しません.htaccess。たぶんrm -rf /path/to/directory/.?試したことがありません。
マークベリー

@MarkBerry rm -rf /path/to/directory/.*
リリアンA.モラル

@ LilianA.Moraru、今日はいくつかのテストを行いました。rm -rf /path/to/directory/.*指定されたディレクトリ内の隠しファイルのみを削除します。@Rinzwindの回答に対する@danjjlのコメントを見て、隠しファイルも削除するには、実行するshopt -s dotglob前に実行しrm -rf /path/to/directory/*ます。
マークベリー

注意: rm -rf /path/to/directory/.*私のシステムでは、のアイテムが削除されました/path/to。幸いなことに、私はデータ全体を別のディスクにバックアップしました。言うまでもなく、rm -rf /path/to/directory/.*コンピューター全体を別の安全な場所にバックアップしていない限り、コマンドを発行しないでください。
法律家

43

ディレクトリ内のすべてのファイル(隠しファイルとサブディレクトリを含む)を削除するには、次を実行します。

rm -rf /path/to/directory/{*,.*}

1
これは美しい受け入れられた答えであるはずです。ありがとうございました!
ナムG VU

3
このグロブは「。」と一致しませんか そして「..」も?
-hertzsprung

4
@hertzsprung -それはありません、それはあなたにそれを削除することができないという警告を与えるだろう./../、それはまだ隠しファイルを削除します。
ライアンホイール

これはMacコンソールでは機能しません。隠しファイルはまだそのコマンドラインにあります。
-agapitocandemor

現在のディレクトリのすべてを削除するには:rm -r $(pwd)/{*,.*}
ジミーアダロ

10

/ path / to / directory内のファイルのみを削除する場合は、次のようにします。

find /path/to/directory -type f -print0| xargs -0 rm 

または

find /path/to/directory -type f -exec rm '{}' \;

を使用してロードをfind実行できます。利点は、パイピングせずに見つかったものをリストrmできるため、開始する前に削除されるものを確認できることです。


2
GNU find-delete述語として。それでもを使用する場合は-exec、で置換\;する+rm呼び出しが収集され、効率が向上します。
エンゾチブ

1
リストがrm -f *と同じように大きすぎるため、「+」が付いた大量のファイルは問題を引き起こします。そして、同じフォルダーから大量のファイルを削除するとき(何百万もの話をする)両方とも良くありません:)最終的にC ++が来て、dir-treeのiノードの順にファイルを削除しました。
オシス

3
rmの後に-を追加する必要があります。それなしでは、ファイル名がある場合は、-rfまたは同様のものがrmの引数として解釈されます。例:xargs -0 rm-または-exec rm-{} \;
リッチム

xargsに-n引数を指定することもできます。つまり、引数の最大数を有することのrmコマンドを分割すなわちようになります「100 -0 RM -n xargsのを- 」100のチャンク内のファイルを削除します
Richm

1
-maxdepth 1を追加して、findがサブディレクトリからファイルを返さないようにすることもできます。つまり、/ path / to / directory -maxdepth 1 -type fを
検索-Richm

7

ディレクトリ内のすべてのファイルとディレクトリ(非表示のものを含む)を削除するには、次を試してください。

  • フォルダを削除してから再作成します

    rm -rf dir_name && mkdir dir_name
    
  • つかいます find

    find dir_name -mindepth 1 -delete  
    

ここでは-mindepth 1、ディレクトリdir_name自体を除外するように指定します。
次のリンクをご覧くださいhttps :
//unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory


ご助言ありがとうございます。リンクの説明を追加しました。
-zeekvfu

3
フォルダーを削除して再作成すると、このフォルダーのアクセス許可が異なる/間違っている可能性があるため、注意してください!
アインジョン

6

すべてのサブディレクトリとディレクトリ自体も削除する場合は、を使用できますrm -rf /path/to/directory。ただし、リターンrm -rfキーを押す前に必ず行をダブルチェックしてください。これにより、スーパーユーザーの権限を持っているときに最初のスラッシュの後に誤ってスペースを挿入した場合など、大量のハボックが発生する可能性があります...


1

自分で検索すると、この質問は常にGoogleのトップにあるため、

他の答えには、さまざまな問題があります。

  1. それらの一部には...ノイズが多く、混乱を招き、迷惑なものが含まれます。

  2. それらのいくつかは、隠しファイル(ドットで始まるファイル)を忘れます。

  3. ディレクトリ削除を許可するために、正しい(最も深い)順序で削除しません。

  4. それらは他の(マウントされた)ファイルシステムに降りますが、これはしばしば望ましくありません。

  5. 追加のパラメーターを使用して適切に拡張することは困難です(詳細は以下を参照)。

したがって、ディレクトリ内のすべてのファイルとフォルダーを再帰的に削除するには、次の操作を行います。

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

-xdevマウントへの下降を防ぐために引数などを追加したことに注意してください(/procなど)。

なぜ-depth-delete

人々は私に絶えずこれを支持しているにも関わらず、これらの方法には欠点があります。-pruneサブディレクトリを(問題を追加することなく)許可するのに十分な拡張性がないようです。この方法とは対照的に、挿入することができます

-not \( -path "${DIR}/subdir" -prune \)

内容の削除から-mindepth除外する引数の前subdir


そして、深さ優先の場合、そのための-depthフラグがありfindます。
セルギーKolodyazhnyy

ええと...なぜ-delete一緒にfind使用ないのですか?-delete深さ優先です。既にPOSIX以外でPOSIX findを想定している-printfので、同様に使用する-deleteか、または-depth -print0 | xargs -0 rm
-muru

@muru:よく分からなかったので...変更します。
Mehrdad

@muru:実際には、あなたの方法はうまくいかないよう-not \( -path "$DIR/subdir" \)ですが...私はそうですか?どうして?
Mehrdad

@Mehrdadそれは何をすることになっていますか?
ムル

0

あなたはできるcdディレクトリに、コマンドを実行しrm *.*、あなたが覚えていればちょうどDOSのように。


1
DOSは、ファイルの場合はDEL、空のディレクトリの場合はRMDIRであり、隠しファイルとシステムファイルでは、これらのATTRIB属性を最初に削除する必要があります。それほど単純ではありません;)
エリック

0

現在のディレクトリを削除するには、たとえば rm -d ./*

-dは、ディレクトリも削除するように指示します。

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