rm -rfすべてのファイルとすべての隠しファイル。&..エラー


83

rm -rf /some/path/* そのディレクトリ(およびサブディレクトリ)内の非表示でないファイルをすべて削除します。

rm -rf /some/path/.* そのディレクトリ内のすべての隠しファイルを削除しますが(サブディレクトリは削除しません)、次のエラー/警告も表示します。

rm: cannot remove directory: `/some/dir/.'
rm: cannot remove directory: `/some/dir/..'

警告/エラーを受信せずにターゲットディレクトリに再帰的にすべての隠されたおよび非隠しファイルとフォルダを削除する適切な方法は何である...

回答:


40

常にエラーメッセージを送信できます /dev/null

rm -rf /some/path/.* 2> /dev/null

あなたもできる

rm -rf /some/path/
mkdir /some/path/

...最初に隠しファイルを気にする必要はありません。


2
しかし、隠しファイルだけを削除したい場合はどうすればいいですか?
CMCDragonkai 14年

@CMCDragonkaiは別の質問ですが、解決策はGillesの回答で見つけることができます(rm ..?* .[!.]*それを行うべきです)。
evilsoup

15
ディレクトリを削除および再作成しないと、ファイルのアクセス権がすぐに失われるというリスクが生じます(特にサーバー環境では重要です)。誰が以前と同じ権限でフォルダを自動的に作成できますか?
ヨ・ルドケ

1
@YoLudkeあなたは絶対に正しいです。多くの場合、それは問題ではありませんが、フォルダーを削除して再作成することは、そのフォルダーを空にすることと意味的に同等ではありません。だから注意してください!
トーマス

ディレクトリを削除できるとは限りません。私の場合、ディレクトリはドッカーボリュームであり、ボリューム内で何でもできますが、コンテナー内からボリューム自体を変更することはできません。
dovidweisz

85

*、すべての非ドットファイルと一致する.[!.]*すべてのドットを除くファイルと一致する.名前が始まり、ファイルを..、そして..?*除くすべてのドットのドットファイルと一致します..。一緒にすると、.と以外のすべてのファイルに一致します..。これらの3つのパターンのいずれも一致しない場合、それ自体に展開されます。rm -f存在しない引数を気にしないので、これは重要ではありません。

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

を使用することもできますfind。これはより複雑ですが、上記のワイルドカードがシステムのコマンドラインの長さ制限を超えて拡張するほど多くのファイルがある場合でも機能するという利点があります。

find . -name . -o -prune -exec rm -rf -- {} +

ディレクトリを削除して再作成するとわかりやすくなります。これには、別のプログラムが元のディレクトリにファイルを同時に作成している場合でも、空のディレクトリになるという利点(または場合によっては欠点)があります。


8
これは、親のトラバースと削除の可能性を防ぐため、受け入れられた答えでなければなりません。
-rbellamy

find代替手段はいくつかのファイルが正常に削除されていない場合でも、「成功」を返します。スクリプトには適していません。
フランクリンゆう

2番目のfindコマンドに関して、findのマンページには「-deleteは-depthを意味するため、-pruneと-deleteを一緒に使用することはできません」と記載されています。-まだ使用しています-prune -deleteか?
ドクターJ

@DoktorJ確かに、-pruneここでは何もしません。読み返して、質問に正しく答えなかったことがわかりました。再帰しないように注意しましたが、質問は明示的に再帰的な削除を要求しています。答えを修正しました。
ジル

2
@haylem zshでは、zshは履歴参照として解析されるため、履歴置換が有効になっている場合(デフォルトでは対話式ですが、スクリプトではそうではありません)の.[^.]*代わりに記述する必要があります。しかし、zshの中で、あなたが最初の場所で、あなただけ使用することができます必要はありません(なしドットファイルをインクルードするか、ワイルドカードの試合で)。.[!.]*!*(D)...
ジル

21

これがほとんどのLinuxディストリビューションで最も便利な方法であることに気付きました。

ls -A1 | xargs rm -rf

どこ

-A= とを除く すべてリストする...

-1 =すべてのアイテムを1行に入れる


4
私が見る欠点は、これを行うにはディレクトリに「cd」する必要があります。
クマー

ls -A1 /your/path/ | xargs rm -rf適用する必要があります
ゴジランテ

nope..itは役に立ちません-例:ls -A1〜/ test / | xargs rm -rfこのコマンドは、現在~~ testにない「cd into」のファイルを削除します。
クマー

5
ファイル名に空白、改行、引用符、またはバックスラッシュが含まれていると機能しません。
ステファンシャゼラス

1
-1上記のコメントのため。↑↑↑↑↑↑↑↑
somethingSomething

15

dotglobシェルのオプションを変更して*使用するか、のようなものを使用してくださいfind

find somedir -mindepth 1 -delete

2
または、単純rm -rf /some/dirにその場所に新しい空のディレクトリを作成することもできます。
トリプリー

これまでのベストオプション。ディレクトリパスを明示的に指定するため、非常に安全です。
ヤニックギルアール

4

これは@Gillesの回答と同じように機能しますが、よりコンパクトです。

rm -rf {,.[!.],..?}*

または

rm -rf dir/to/files/{,.[!.],..?}*

if安全のために、スクリプトでの使用も追加する必要があります。

if [ -d "$DIR" ]; then
    rm -rf ${DIR}/{,.[!.],..?}*
fi

1
奇妙なことに、Ubuntu 16.04 LTSのbashエイリアスとして、以前の答えは機能しませんでした。しかし、alias cleandir='rm -rf {,.[!.],..?}*'そうです。
スティーブンヴェンティミリア

3

Findはあなたの友達です。

find ! -name '.' ! -name '..' -delete

% find ! -name '.' ! -name '..'
./test
./test4
./test4/.test6
./test3
./.test5
./test2
% find ! -name '.' ! -name '..' -delete    
% find ! -name '.' ! -name '..'     
%             

現在のディレクトリ($ PWD)以外のものを再帰的に検索する場合は、findコマンドの直後にパスを追加します。例えば、find /path ! -name '.' ! -name '..' -deletenディレクトリーの数だけ降ろしたい場合は-maxdepth n/pathパラメーターの直後にオプションを使用します。

上記のコマンドは、Ubuntu 13.04システムでテストされました。他の最新のLinuxシステムで動作する可能性があります。


現在のディレクトリ内のすべてのディレクトリを削除するにはfind . ! -name '.' ! -name '..' -type d -delete
Andy

2

についての警告/エラーを受け取ることなく、ターゲットディレクトリ内のすべての隠しファイルと非隠しファイルとフォルダを再帰的に削除する適切な方法は何ですか?そして..?

問題のディレクトリをされたと仮定すると./dir、その後、

rm -rf ./dir

./dir、隠しファイルやディレクトリを含むのすべてのファイルを再帰的に削除し、./dirディレクトリ自体を含めます。

ディレクトリ自体を削除したくない場合は、後で再作成するか、または

find ./dir -mindepth 1 -delete

または、findサポートしていない場合-delete

find ./dir -mindepth 1 -depth -exec rm -rf {} ';'

を使用-mindepth 1すると、最上位ディレクトリを保持できます./dir


これはベストアンサーとしてマークする必要があります
kitingChris

1

試してみることをお勧めします

ターン・オン ドット(隠しファイル)

  • セットする dotglob

    shopt -s dotglob

ターン・オフ ドットを

  • 設定解除 dotglob

    shopt -u dotglob

このメソッドは、隠しディレクトリが欠落しているコピーコマンドに期待どおりに機能ました。

    shopt -s    dotglob
    cp    -rvn  ./$from/*  ./$too/
    shopt -u    dotglob

だから私は削除(削除)をし、そしておっと ...

    shopt -s    dotglob
    rm -fr ../message_splitter--044a/*
    shopt -u    dotglob

... それも動作します!

親愛なる読者がディレクトリを見ることができないことは私に起こりますmessage_splitter。いずれにしても、.svn削除する必要があるフォルダーがあり、そこにコピーされます。

manページから ...

dotglob 設定すると、bashには「。」で始まるファイル名が含まれます。パス名展開の結果。

参照:


-2

このコードを試してください:

Dirlist=``find /some/path/ -type d -name '.[^.]*'`
for HiddenDir in $Dirlist
do
    rm -rf $HiddenDir
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.