web-dev-qa-db-ja.com

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

rm -rf *は、現在のディレクトリ内のすべてのファイル/フォルダーを削除しますか?ワイルドカード*が上位のディレクトリに移動してファイルシステムがすべて消去されないようにしたいのですが。 :D

私はchmod 777 .* -Rchmod隠しファイルにchmod実行したことを覚えています。明らかに、私はrootアカウントを使用していました。

21
Olivier Lalonde

いいえ、シェルを何度も調整しなかった場合、.で始まるファイルやディレクトリは削除されません。それらも削除するには、明示的にリストするか、

rm -rf .file .dir

または正しいグロブパターンを使用してください(クリスに感謝)

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

[〜#〜] edit [〜#〜]ここでのポイントは、.*を使用して.fileなどのファイルを照合することはできないということです。なぜなら、.*または.*?は、..または.にも一致します。 .[^.]*.fileなどのファイルに一致し、..?*..fooなどのファイルに一致します(*は0個以上の文字に一致し、?は1文字に一致します)。

16

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

保存可能なすべてのディレクトリエントリに一致するグロブを作成するのは複雑です。 ..;ほとんどの場合、実際に機能する単純な答え(* .??*など)を考え出すのは簡単です。これはインタラクティブに使用する場合は問題ありません。覚えやすく、機能しない時間はポストRM ls -aでキャッチできるためです。スクリプトの場合、すべてを削除して空のディレクトリを再作成する方が簡単です。

12
mpez0

この質問は*が何をするのか(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にのみ展開されているため、file2のみを削除しました。 rm -rf。*と入力すると、次のように入力します。

rm -rf . .. .file1

そして正直に言うと、それは面白くありません;)

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


pdate:ただし、Ankur Goelが指摘しているように、rmには何らかの保護が組み込まれています(シェルコマンドでは珍しいものです)。

新しい遊び場を作成しましょう:

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

これで再びこれができましたが、rmが暴走し始めた場合の保護としてrootがtest1を所有しています。

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のすべての実装がこのように動作するかどうかはわからないので、注意して使用します。

10
Johan

はい。 rm -rfは、現在のディレクトリ内のファイルとフォルダーのみを削除し、ファイルツリーを上に移動しません。 rmは、シンボリックリンクをたどらず、それらが指すファイルを削除しません。そのため、ファイルシステムの他の部分を誤って削除しないでください。

7
Ankur Goel

Mpez0が言ったように1レベル上に移動したくない場合は、rm -rfこの特定のフォルダ、_すべて以外のディレクトリで作業する方法があります.および..現在のフォルダで次のように実行します。

rm -rf $(ls -A)

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

1
tzot

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

_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
_

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

0
Tobias Kienzler