ファイルが 1 つしかないディレクトリを考えてみましょう.foo
。その後rm -rf *
、削除しません.foo
; だけrm -rf .*
です。これはなぜですか?.
(これはデフォルトのとに関係があると思います..
が、設計の根拠は何ですか?ドットファイルを削除する必要がある場合、ドットファイルを残す傾向があります。)
4 に答える
Rob Pike 氏によると、名前がドットで始まるファイルは「非表示」にする必要があるという考え全体は、ソフトウェアのバグの結果でした。
特に、彼は次のように述べています。
まず、悪い前例が作られました。他の多くの怠惰なプログラマーは、同じ単純化を行ってバグを導入しました。ピリオドで始まる実際のファイルは、カウントされるべきときにスキップされることがよくあります。
第二に、さらに悪いことに、「隠し」または「ドット」ファイルのアイデアが作成されました。[...]
隠しファイルの概念が意図しない結果だったと確信しています。確かに間違いでした。
過去の事故はさておき、隠しファイルをワイルドカード展開から除外することは、保守的な設計上の決定として適切です。そうしないと、次のようなコマンドrm *
は、ユーザーが意図したよりも多くの損害を与える可能性があります。
これは、 で始まるファイル.
は通常非表示であり、通常のグロビング展開の一部ではないためです。これは、制御ファイルまたはディレクトリ (例: )を含むディレクトリでめちゃくちゃなグロブを取得しないことを意味します.svn
。を使用するときは*
、通常、通常のファイルに展開することを意図しています。
Bashマニュアルから:
ファイル名の展開にパターンを使用すると、文字「.」
dotglob
シェル オプションが設定されていない限り、ファイル名の先頭またはスラッシュの直後にある は、明示的に一致する必要があります。ファイル名を一致させる場合、スラッシュ文字は常に明示的に一致させる必要があります。それ以外の場合は、「.」キャラクターは特別扱いされません。
理由については、私は推測することしかできません。存在を知らなかったファイルを誤って操作しないようにするためだと思います ( がls
表示されないことを思い出してください.foo
)。
この背後にある設計上の根拠は、たとえば.foo
が隠しファイルであるということです。ディレクトリ全体に対する不安定な操作は、意図した以上の損害を与える可能性があります。