rm -rf *は現在のディレクトリ内のすべてのファイル/フォルダを削除しますか?


20

意志 rm -rf * 現在のディレクトリ内のすべてのファイル/フォルダを削除しますか?ワイルドカードを確実にしたい * 上のディレクトリに移動してファイルシステムをすべて消去することはしません。 :D

覚えてる chmod 777 .* -Rchmod 隠しファイルとそれ chmod 私のすべてのファイルシステムを編集しました。明らかに、私はrootアカウントにいました。


1
これが私がやる理由です rm -rf ./* そして明示的に現在のディレクトリを指定します...しかし、Ankurはそれがとにかく問題ないと言っているようです。
mpen

@マーク:..と./ ..の違いは何ですか?あなたはcd ./ ..を試みることができて、あなたがどこで終わるかを見ることができます:)
Johan

@ジョアン:違いはありません...私はそれが私の狂った頭の中でもっと理にかなっていると思います:D
mpen

@マーク:するのは簡単な間違い:)
Johan

回答:


15

いいえ、あなたがあなたのシェルをあまりひねらなかったなら、これはaで始まるファイルやディレクトリを削除しません。 .。それらを削除するには、それらを明示的にリストすることもできます。

rm -rf .file .dir

または正しいグロブパターンを使用する(Chrisに感謝)

rm -rf .[^.]* ..?*

編集 ここでのポイントはあなたが使用できないということです .* のようなファイルに一致させる .fileなぜなら .* または .*? また一致します .. または ..[^.]* 好きなファイルにマッチ .fileその間 ..?* 好きなファイルにマッチ ..foo* ゼロ個以上の文字と一致します。 ? 正確に1つに一致します。


1
あなたはまた、のようなものが必要です ..?* 「..」で始まるエントリを捕らえる(例: ..foo
Chris Johnsen

@クリス:わかりました、私はこのうるさい狂気を始めました、あなたは正しいです;)
Benjamin Bannier

「正しい」グロブパターンを使用するだけでなく、一致するアイテムの数についても異なります。膨大な量のファイルを含むディレクトリでは、シェルは1回のターンで50kのファイルを提供できない可能性があります。 rm。そのため、ディレクトリの内容を*で削除するのは賢明な方法ではありません。
akira

説明すると思う xargs この質問の範囲を少し超えています。例えば、シェルが引数リストの長さを訴えたとき、それについて考え始めてください。
Benjamin Bannier

1
OPは彼の究極の問題/解決方法を達成する方法がわからないと思うので、範囲外ではないと思います。ディレクトリのすべての内容を削除します。 OPは、すでに解決策(悪い解決策)を念頭に置いて、この解決策で問題が発生する理由を尋ねることによって、一般的な "間違った"ことをしているだけです。もっと良い方法は、「ディレクトリ自体を削除せずにディレクトリ内のすべてのファイルを削除する方法」です。グロブがどのように機能するかという性質上、OPの解決策は問題を引き起こします。
akira

11

ディレクトリとその内容をすべて削除したい場合は、 chdir 親ディレクトリに rm -rf そのディレクトリを名前で、グロビングの質問全体を迂回して。内容を削除してディレクトリを保持する場合は、すべてを削除してからディレクトリを再作成するのが最も簡単です。

すべての可能なディレクトリエントリを保存するグロブを考え出すのは複雑です。そして、簡単な答えを思いつくのは簡単です(例: * .??* )それは実際にはほとんどいつもうまくいくでしょう。これは対話的な使用には問題ありません。覚えておくのが簡単で、うまくいかない時はpost-rmで捕らえることができます。 ls -a。スクリプトの場合は、すべて削除して空のディレクトリを再作成する方が簡単です。


1
それは私が同様に提案するものです:ディレクトリを捨ててやった
akira

たとえそれが答えではないとしても、それは良い考えです。
Johan

10

この質問は*が何をするのか(rmではなく)に関するものだと思うので、別の方法を試してみましょう。


*が何をするのかわからない場合は、まずechoのような無害なコマンドを使って "テスト"できます。 あなたがこれを実行する前に、あなたがあなたのホームディレクトリでそれらを実行した場合、彼らが何を表示するのか推測してみてください。

echo *
echo .*

しかし、最初に私たちが星と遊ぶことができるように遊び場を作りましょう。

mkdir ~/star_test/
cd ~/star_test/
>.file1
>file2

今このディレクトリに私たちはこれを持っています:

cj@zap:~/star_test$ ls -1a
.
..
.file1
file2

echoコマンドを使用して、*が展開される内容に注目してください。

cj@zap:~/star_test$ echo *
file2
cj@zap:~/star_test$ echo .*
. .. .file1

それでは、rmコマンドで何が起こるのか見てみましょう。

cj@zap:~/star_test$ rm -rf *
cj@zap:~/star_test$ ls -1a
.
..
.file1

ご覧のように彼はfile2を削除しただけでした。 rm -rf。*と入力すると、これは次のように書くのと同じになります。

rm -rf . .. .file1

正直に言うと、それは面白そうには見えません。

これがあなたの質問の*部分を明確にすることを願っています。


更新: しかしAnkur Goelが指摘しているように、rmにはある種の保護が組み込まれています(シェルコマンドにとってはちょっと変わったことです:)

新しい遊び場を作りましょう。

cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2

それで今再び我々はこれを持っています、しかし保護としてrootによって所有されるtest1で RMは凶暴になり始める。

cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
cj@zap:~/star_test/test1/test2/test3$ echo .*
. .. .file1

それでは、すべてを削除しましょう。

cj@zap:~/star_test/test1/test2/test3$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2

そして、それはrmが削除しなかったように見えます。そして私達が彼に言ったとしても!

それで、この長い答えの後に、これでdirの中のすべてを削除するのが安全であることがわかります:

rm -rf * .*

しかし、rmのすべての実装がこのように動作するかどうかわからないので、これは慎重に使用します。


7

はい。 rm -rfは、現在のディレクトリ内のファイルとフォルダのみを削除し、ファイルツリーを上りません。また、rmはシンボリックリンクをたどり、それらが指すファイルを削除しません。そのため、ファイルシステムの他の部分を誤って整理することはありません。


1

mpez0が言ったように1レベル上に移動したくない場合 rm -rf この特定のフォルダに取り組む方法があります すべて ディレクトリ/ファイル以外 . そして .. 現在のフォルダで

rm -rf $(ls -A)

もちろん、いずれかのディレクトリ/ファイルにシェル内の文字の1つが含まれている場合 IFS 特殊な変数(スペース、タブ、改行など)を使用する場合は、最初にIFSを変更し、コマンドを実行してからIFSを復元します。


0

フォルダ全体を空にする、はるかに簡単な方法で説明した「引数が多すぎる」という問題も回避 この答え ディレクトリ自体を削除して再作成するだけです。シンボリックリンクディレクトリにいるときにこれが正しく機能することを確認するために、次の行を使用します。

cd ..
rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink
                        # by using readlink, to recreate the linked-to directory
mkdir $(readlink -f yourdir) # recreate the directory to have it empty
cd yourdir

(あなたが使用する場合 yourdir の代わりに $(readlink -f yourdir) 元の場所がいっぱいの間にリンクを置き換えるだけです)


1
これにより、フォルダのiノードに依存しているものが壊れ、権限、atime / mtime / ctime / btime、拡張属性、およびアクセス制御リストが破棄される可能性があります。
Daniel Beck

@ DanielBeckありがとう、良い点。不思議に思うかもしれませんが、ハードリンクとは別にiノードに何が正当に依存しているのでしょうか(ディレクトリには関係ありません)。しかし権限などは重要です。だから最も一般的なケースでは1 すべき おそらく使う xargs...
Tobias Kienzler

OS Xには、移動中のファイルやフォルダを処理しても関連付けを保持できるメカニズムがあります。最も目に見える 最近の文書を開く メニュー。私の知る限りでは、iノードを使って内部的にそれを実現しています。 より詳しい情報 。他のシステムが同様のものを実装していても私は驚かないでしょう。 GUIプログラムのAPIで。
Daniel Beck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.