なぜrmで再帰が上に行かないのですか?


13

私は一般的に再帰の方向、具体的にはrmについて疑問に思っています。

rm再帰は下向きにしか機能しませんか?

実行中: sudo rm -R *.QTFS現在のディレクトリとその子にあるすべての* .QTFSファイルを削除しますか?

で表示される現在のディレクトリには、より良い単語がないためのリンクとリンクがls -lha含まれているので、なぜディレクトリツリー内で再帰がこれらの上位をたどらないのですか?rmアプリに人為的な制限はありますか、それとも本物ではありませんか?......


5
そのため、ルート、および狂気、その方法は、嘘...
jasonwryan


1
まあ、興味深い逸話のために...ある時点でrm -rfをいくつかの無邪気なサブディレクトリで実行し、ユーザーが非常に重要なアップストリームにハードリンクされたものを持っていることを私の恐怖に見つけました。ええ、現在のバックアップはありましたが、データは失われませんでしたが、警告の話にしてください... :-)
ブライアンノブラウフ14

@BrianKnoblauch、ハードリンクを削除することでどんな害がありますか?私はあなたの話のポイントを得ませんでした...
アレクセイ

@Alexeyポイントは、ハードリンク自体が削除されなかったことです。それはそう...みんなのデータを食べ始め、ファイルシステムで高いポイントにリンクされたハードリンクされたディレクトリの中にダウン再帰
ブライアンKnoblauch

回答:


18

rm 再帰は下向きにしか機能しませんか?

rm -r x yを削除xy、その中のすべて(ディレクトリである場合)を削除しますが、その親またはその外部のものは削除しません。

実行中:sudo rm -R *.QTFS現在のディレクトリとその子にあるすべての* .QTFSファイルを削除しますか?

いいえ。これは、指定されたすべてのファイルが削除されます*.QTFS、再帰的にすべてのファイル内のディレクトリと呼ばれ*.QTFS、そしてそれらのディレクトリに自分自身を。他の削除動作が必要な場合は、を使用しますfind -delete

で表示される現在のディレクトリには、より良い単語がないためのリンクとリンクがls -lha含まれているので、なぜディレクトリツリー内で再帰がこれらの上位をたどらないのですか?rmアプリに人為的な制限はありますか、それとも本物ではありませんか?......

の人為的な制限ですrm

しかし、実際にはそれほど人工的ではありません-それが機能する唯一の方法です。場合はrm、親に続く..リンクを、すべてのは、rm -r次のすべてによって、システム上のすべてのファイルを削除します..すべての方法バックへのリンクを/rm見ている...、それは時に各ディレクトリ内のエントリを一覧表示したコンテンツを、と明示的な理由のためにそれらを無視します。

実際に自分で試してみることができます。実行するrm -r .と、ほとんどのrm実装は動作を拒否し、エラーを明示的に報告します。

$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’

(そのメッセージはGNUからのものrmです。他のものも同様です)。明示的な引数としてではなく、暗黙的にこれらのエントリに遭遇すると、それらを無視して続行します。その動作はPOSIXに必要です。GNU rmおよび多くのBSDではfts_read、階層トラバーサル機能のファミリーによって自動的に提供されます。

または...本物ではありませんか?

.そして、..されている一般的にそれはファイルシステム固有のですが、実際のディレクトリエントリ。関係なく、ほとんどすべてのユーザーコードへの実際のエントリであるかのように表示されます。ソフトウェアの多くの部分(だけでなくrm)は、暴走や望ましくない再帰をキャッチまたは防止するために、その動作を特別なケースにしています。


証拠を探している(または単に興味がある)方は、GNU coreutilsでこれがどのように実装されているかを見てください。
クリスヘイズ14

@ChrisHayes同等のgitwebリンクが答えにあります。fts_readただし、実際の再帰的なケースは実装にありますが、それはコマンドライン引数のためだけです。
マイケルホーマー14

@MichaelHomerおお、すごい。そのリンクの色は、このSEスキームで際立っていませ。私の間違い。
クリスヘイズ14

2
この答えは正しいですが、少し不正確です。rmバイナリが呼び出される前にbashによってファイル名にグロブ展開されているため、rm見えません*.QTFS。@tobyinkの答えは、それを指摘しています。
デニーズ14

追記、それらとして.及び..特別な場合の動作であると言われているドットファイルの存在の原因
mgarciaisaia

5

マイケル・ホーマーが書いたことに加えて、誤って親ディレクトリに再帰するのを困難にする別の要因があります。

ホームディレクトリに移動し、次のように入力します。

echo *s*

文字「s」を含むファイルとディレクトリのリストが表示されていることがわかります。ただし、先頭のドットで始まるファイルは表示されません。それらを表示するには、次を使用できます。

echo .*s*

これは、シェルが*先頭のドットを囲むように展開することを拒否するためです。この意味は:

rm -fr *

に再帰しません..

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.