web-dev-qa-db-ja.com

`ln -sf`はシンボリックリンクのみである既存のファイルを上書きしますか

coreutilslnマニュアルから:

通常lnは既存のファイルを削除しません。 -force-f)オプションを使用して削除します
無条件に、それらを条件付きで削除する-interactive-i)オプション、
および-backup-b)オプションで名前を変更します。

$ mkdir output

私はこの失敗を理解できます:

$ ln -sT /etc/passwd output
ln: failed to create symbolic link ‘output’: File exists

しかし、なぜ-fまたは失敗:

$ ln -sfT /etc/passwd output
ln: ‘output’: cannot overwrite directory

します-fシンボリックリンクのみである既存のファイルを上書きしますが、他のタイプのファイル(ディレクトリ、通常のファイルなど)は上書きしませんか?

できる -T最後の引数(つまり、ターゲットファイルの引数)が既存のディレクトリである場合に使用して、ディレクトリをリンクに上書きするつもりですか?

5
Tim

UNIXでは、ディレクトリはspecialです(私はSNLからThe Church Ladyをチャネリングしているように感じます)。ディレクトリには他のファイルが含まれているため、それらを削除するには別の操作が必要です。ディレクトリが空の場合でも、2つのファイル(...)が残っているため、ディレクトリが本当に空になり、関連ファイルのリンク数が更新されるまで、ディレクトリの削除は実行できません。 。

UNIXの初期(私の最初の経験はBell Labsの第6版でした)には、通常のファイルとディレクトリに対して2つの異なるコマンド(rmrmdir)がありました。 2つの異なるシステムコールでした。 rmは単純で、名前を付けたエントリをディレクトリから削除し、参照先のファイルの参照カウントをデクリメントしました(もちろん、参照カウントが0)。 rmdirはさらに多く(実際にはアプリではなく、システムコールで)必要であり、ディレクトリに移動して.および..エントリを見つけ、それらのiノードに移動する必要がありました。参照カウントをデクリメントしてから、親のエントリを削除し、その参照カウントをデクリメントします(ディレクトリ自体の.でデクリメントされたのと同じもので、0になるはずです)。これらすべてがいくつかの異なるディスクセクターにまたがっていたため、どの時点でもアボート(つまりシステムクラッシュ)の可能性をfsckで回復できるように注意深く調整する必要がありました。

もちろん、より最近のUNIXシステムでは、ハードウェアの制約(つまり、64Kバイトの最大プログラムサイズ、つまりis a "K")が緩和され、rm -rと多くのことができるようになりましたその基礎となるspecialの性質のディレクトリはそれほど明白ではありませんが、それはまだそこにあります。各ディレクトリに移動し、すべてのファイルを削除し、親に戻ってrmdirを実行し、基本的にすべてのディレクトリツリーを再帰的にすべて再帰するという、6番目のエディションのマシンで大きなツリーを削除する必要があったことを覚えています。私たちはこれを助けるためのスクリプトについて考えましたが、当時はめったに出てこなかったため、誰かがすべての努力をするように要求することで壊滅的なミスを防ぐことができると判断するのは十分に危険でした。

Sudo rm -rf /ではなく「./」と入力した」という質問を初めて受け取ったとき、どうすれば回復できますか?なぜ私たちが用心深いのか理解できます。

8
MAP