web-dev-qa-db-ja.com

エレガントな方法でディレクトリのコンテンツを削除する

現在の作業ディレクトリのすべてのコンテンツを削除したいと思います。効率的かつエレガントな方法でそれを行う方法は?

私はいくつかのファイル、ディレクトリを持っています、そしてそれらのいくつかは次のようにドットで始まります:

touch .abc; touch abcd ; mkdir foobar; touch "file name" "#"

このディレクトリを空にするための、posix互換のエレガントなソリューションを探しています。私のアイデアのいくつかを投稿しますが、どれも完璧ではありません。

1
Michał Šrajer
rm -rf -- * .*

これは移植可能で機能しますが、zshを除いて、警告を発行するため、見苦しいです。

rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
6
Michał Šrajer

これを試して:

find . -maxdepth 1 -not -name \. -exec rm -rf \{\} ;
2
Paweł Nadolski

可能性:

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

ファイルのリストが大きすぎると失敗する可能性がありますが、これは失敗しません。

find . ! -name . -Prune -exec rm -rf {} +

zshの場合:

rm -rf -- *(D)
2

私が見つけた最善の解決策は次のとおりです。

find . -delete

ただし、-delete述語は危険であり(manを参照)、私はそれを使用するのが好きではありません。

更新:

-delete述語は、findのロジックの詳細に精通していない人が使用すると災害を引き起こす可能性があるため、好きではありません。例えば:

find . -delete -name '*.bak'  # DO NOT DO IT!!!

誰かがそのような呼び出しで '* .bak'ファイルのみを削除することを期待するかもしれませんが、それはfind . -deleteとまったく同じです。

1
Michał Šrajer

どうですか

 rm -rf * .[a-z]* .[A-Z]* .[0-9]*

それは機能しますか?または、他のファイル名パターンも一致させますか?

0
MelBurslan

別のオプションは、ディレクトリのpwdcd ..rm -rfの値を記憶し、ディレクトリを再作成することです。これも多くの理由で醜いです。

ところで、反対票を投じないでください。必要に応じてコメントしてください。

0
Michał Šrajer

最初にファイルを削除し、次にディレクトリを空にします。

find . -type f -exec rm \{\} \;
find . -depth -type d -empty -exec rmdir \{\} \;
0
Paweł Nadolski