web-dev-qa-db-ja.com

ドットで始まる現在のディレクトリ内のすべてのファイルを削除するにはどうすればよいですか?

私はUbuntu 14.04を使用していますが、ターミナルでSudo suを使用してrootになり、rootのゴミ箱を手動で削除したいと思いました。ドットで始まるいくつかのファイルを除いて、すべてを削除しました。 .htaccessなどのように、そのディレクトリ(「ファイル」)に移動して、次のコマンドを実行しました。

rm -rf .*

それらのファイルは削除されましたが、システムが「。」を削除できなかったというエラーメッセージも表示されました。そして「..」それはどういう意味ですか?ディレクトリツリー全体を削除しようとした場合はどうですか?私が言ったように、そのコマンドを実行しているとき、私は最下位のディレクトリにいました。これは正確には次のとおりです。/root/.local/share/Trash/files/私は自分のPCを撃墜し、電源を入れました。一見すべてが正常のようです。では、何が問題で、システム全体に深刻な損害を与える可能性があるかどうかを確認したいと思います。言い換えれば、私は今心配するべきですか、それともすべて大丈夫ですか?

6
Gregory

.*は、名前が.で始まるすべてのファイルに一致します。すべてのディレクトリには、ディレクトリ自体を参照する.というファイルと、親ディレクトリを参照する..というファイルが含まれています。 .*にはそれらのファイルが含まれています。

幸いにも、.または..を削除しようとすると失敗し、無害なエラーが発生します。

Zshでは、.*.または..と一致しません。 bashでは、

GLOBIGNORE='.:..:*/.:*/..'

次に、*は、ドットファイルを含む、...を除くすべてのファイルに一致します。

または、.および..を明示的に除外するワイルドカードパターンを使用できます。

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

または

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

または、findを使用します。

find . -mindepth 1 -delete

すべてのドットファイルを削除する場合、規則は次のコマンドを使用することです。

rm .??*

これにより、少なくとも2つの他の文字を含むドットで始まるすべてのファイルが削除され、.および..そのまま。もちろん、ドットの後に1文字しか含まれていないファイル名も見逃しますが、これらはまれなはずです。

4
Johan Myréen
find /path/to/dir -type f -name ".*" -delete
1
davidcondrey

目的に応じてエラーを無視できます。

ワイルドカード一致を使用しました。正規表現と混同しないでください。で始まるすべてのファイルを削除するとしました。何もない、またはその後に何かがある。

エラーメッセージは、...が含まれるためです。 .は現在のディレクトリのショートカットで、「..」は親ディレクトリのショートカットです。 (技術的には別の意味ですが、この会話では機能します)。

あなたは現在あなたがいるディレクトリを削除できません、他にどこにいますか?そして、あなたはあなたの親ディレクトリを削除することはできません。これは厳密には当てはまりません。現在のディレクトリと親ディレクトリを削除できますが、ツール(この場合はrm)はそれを作成するように設定されています少し難しいです。そうすることは少し直観に反するからです。

何がうまくいかなかったか、そして私が何をしたことが本当にシステム全体に深刻な損害を引き起こす可能性があるか?

あなたの質問の情報に基づいて、my答えは「はい」です。何か間違ったことをしたので、はい、システムにかなり深刻な損傷を与えた可能性があります。

何よりもまず、昇格した特権でそのコマンドを実行しました。既に結果がわかっている場合を除き、昇格された特権を使用して再帰的に何かを実行することは絶対にしないでください。自分が何をしているか正確に知らない限り、昇格された特権を持つものは絶対に削除しないでください。次回はmvを使用します。そうすれば、何かを台無しにした場合は、元に戻すことができます。

実際にどのような損害を与えたかについては、ごみ箱を削除していたため、おそらくそれほど多くはありませんが、特に、昇格した特権でそのコマンドを実行した場合は、本当にそうなります。

1
coteyr