式.*
現在のディレクトリと親ディレクトリを含むようにbashによって拡張されます:
$ ls -la
total 2600
drwxrwxrwx 2 terdon terdon 2162688 Sep 10 16:22 .
drwxr-xr-x 142 terdon terdon 491520 Sep 10 15:34 ..
-rw-r--r-- 1 terdon terdon 0 Sep 10 16:22 foo
$ echo .*
. ..
rm -rf .*
を実行すると GNU bashを使用している私のDebianで、version 4.2.36(1)-release
およびrm
rm (GNU coreutils) 8.13
から 、次のメッセージが表示されます:
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
これはGNUのものですか、それともPOSIXですか?上記のコマンドがサイレントに.
および..
?
また、これはシェルまたはrm
の安全機能ですか コマンド自体?
承認された回答:
rm
のPOSIX仕様の最新(2017年現在)バージョン ユーティリティはここ(および前のユーティリティ)にあり、.
および..
。
ファイルdotまたはdot-dotのいずれかがオペランドのベース名部分(つまり、最終パス名コンポーネント)として指定されている場合、またはオペランドがルートディレクトリに解決される場合、rmは診断メッセージを標準エラーに書き込み、何もしません。そのようなオペランドでもっと。
@jlliagreが指摘しているように、/
に関する部分 SUSv4に追加されました。
私が見つけた最も古い公に利用可能なUnix仕様(XPF4 CAE rev2(1994))は、すでにその.
および..
GNU fileutils変更ログのコメントは、以前のPOSIX仕様ではすでにそうであったことを示唆していますが、削除することはできません。
dir/..
に適用されることに注意してください および../
同様に、一部の実装(Solaris 11やmacOSなどのUNIX認定の実装を含む)は、rm -rf ../
に対してまだ保護されていません。 またはrm -rf .*/
。
履歴
初期のユニス
-r
rm
のオプション Unix V3(1973)で追加されましたが、ディレクトリのコンテンツを削除するだけでしたが、それでもrmdir
を使用する必要があります。 ディレクトリを削除します。
これはUnixV7(1979年、Bourneシェルも導入し、ほとんどのUnicesが派生したリリース)で変更されました。 rm -r
ディレクトリも削除され、..
は削除されなくなりました ディレクトリツリー。マニュアルページには次のように記載されています:
ファイル
..
を削除することは禁止されていますrm -r .*
のようなことをうっかりして行った場合の反社会的な結果を避けるためだけです。 。
(rm -r .*
と主張する人もいるかもしれませんが まだ反社会的 .
のため、すべてが削除されます。 含まれています。
それでも.
.
のリンクは解除されませんが または..
エントリ。したがって、rm -r .
現在のディレクトリを空にする効果的な方法でした。
また、セーフガードはリテラルの..
専用であることに注意してください。 dir/..
ではなく引数 または./..
。したがって、rm -rf ./.*
親ディレクトリ内のすべてを再帰的に削除します。
それが、グロブに.
および..
彼らの拡大で。これは、80年代後半のForsythシェル(元のMinixシェルとpdkshの基礎)で修正されました。zsh
(1990)およびfish
(2005)ただし、他のシェル、特にPOSIX sh
ではありません .*
の拡張が必要な言語 .
を含める および..
readdir()
によって返された場合 (bash
shopt -s dotglob
でのみ問題に部分的に対処します ここでグロブ(.xxx
を除く) 1つ).
または..
、およびksh
、FIGNORE='@(.|..)'
を実行して修正できます 。
.
を正確に禁止する場合 また、追加されたものは必ずしも明確ではなく、Unixごとに異なります。以下のいくつかの調査結果。
BSD
.
の禁止 2.9BSD(1983)と2.10BSD(1987)の間、および4.2BSD(1983)と4.3BSD(1986)の間に追加されました(unix-history-repoで1985年にタイムスタンプが付けられたこの変更を参照してください)。
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.9BSD/root.tar.gz |
zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `..'
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.10bsd.tar.gz |
zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'n");
dir/.
の場合 およびdir/..
、1988年のこの変更を参照してください(BSD 4.3 Net / 1)。
現在まで、rm
FreeBSD(およびmacOSのような派生物)は、rm -rf ./
で現在のディレクトリまたは親ディレクトリを空にします またはrm -rf ../
ただし(rm -rf .*/
の問題 。
System V
V7以降のAT&T Unix派生物では、ソースもバイナリも公開されていないため、多くの情報はありません。オンラインマニュアルの中で、HPUX(System IIIに基づく)は、..
のみを禁止していると述べています。 事実上両方を禁止していますが、これはおそらく少なくともSysIIIが.
(編集 :SysIII rm
を見てみましょう ソースコード、Unix V7以降、実質的に変更されていません。
私がチェックした他のすべてのオンラインマニュアルでは、.
または..
POSIX準拠であると予想されることは禁止されています。
Solaris rm
rm -rf ./
でも、現在のディレクトリまたは親ディレクトリを空にします またはrm -rf ../
。
GNU
GNU fileutilsの初期の変更ログには、すべての履歴情報が含まれています。
元々は.
も削除していませんが または..
禁止されていた、..
最初に禁止され、次に両方(dir/.
を含む)が禁止されました )、すべて1990年から1991年の間。
その他
ご覧のとおり、zsh
、.*
の展開 (または任意のグロブ)に.
または..
(sh
でも エミュレーションモード)。 rm
組み込み(zmodload zsh/files
を実行すると取得します )したがって、.
は処理されません。 または..
特に。つまり、そのzsh
組み込みの場合、rm -rf .
を実行できます。 またはrm -rf ..
.
または..
、ただしrm -rf .*
.
は削除されません または..
。
busyboxのrm
、.
および..
0.52(2001)に追加されました