どうやら ファイル名を...
に変更できます 。
私が正気でない場合、ファイルの名前を..
または.
に変更するにはどうすればよいですか?そのようなファイル名は許可されますか?
バックスラッシュはドットの特別な意味を無効にしていないようです:
$ mv test \.
mv: `test' and `./test' are the same file
..
は特別なものではなく、すでに存在しているだけです。
Unix、Dos、MS-Windowsでは、すべてのディレクトリに.
ディレクトリがあり、それ自体にリンクしています。また、..
ディレクトリは、親ディレクトリ(またはルートディレクトリの場合はself)にリンクしています。
..
と.
が特別な場合は、それらを削除できないためです(実際には、それらを含むディレクトリを削除するだけです)。
したがって、(その他の)ファイルに.
または..
という名前を付けることはできません。
ただし、...
、\
、…
、..
(..
の後にスペースがあるが、ここではほとんど表示されないか、ディレクトリリストに簡単に表示されない)または他の任意の名前のファイルを作成できます。 onlyの予約文字は/
です(警告—詳細:null、nullは特殊文字であり、事物の終わりを示すためにのみ使用され、区切り文字として使用されることもあります)。 .
には特別な意味はありません。ファイル名、カーネル、シェルではなく、エスケープする必要はありません。実際にファイル名が.
で始まる場合は特別です。ファイルは通常非表示ですが、エスケープする必要はありません。
この隠しファイルの動作はls
の初期の実装で発生し、作成者は.
と..
を非表示にしたかったため、.
で始まるファイルを非表示にするコードを作成しました。他のユーザーはこのバグ/機能に気づき、ファイルを非表示にしたいときに.
で始まるファイルの作成を開始しました。
質問者にリンクした質問で、ファイルを親ディレクトリ..
に移動しようとしていますが、名前が...
に変更されます。ドットで始まるファイルはデフォルトで非表示になっているため、ファイルを見つけることができません。
mv a b
の形式でmvを使用する場合
.
に移動すると、実質的には何も行われませんが、mv
はそれをエラーとして扱います。..
に移動すると、ファイルが親ディレクトリに移動します。すべてのディレクトリにはすでにこれら2つの名前のエントリが含まれているため、ファイルの名前を.
または..
に変更することはできません。 (これらのエントリはディレクトリをポイントしており、ファイルの名前をディレクトリに変更することはできません。)
mv
は、宛先が既存のディレクトリであるケースを検出し、それを(現在の名前を使用して)ファイルをそのディレクトリに移動する要求として解釈します。
.
はシェルのメタ文字ではないため、バックスラッシュはこれとは関係ありません。 \.
と.
はbash
と同じです。
問題は、ファイルをディレクトリに移動していることです。これは失敗してもかまいません。
かつての様子をお話します。
mkdirはこれを本質的に読んでいました(これをshで書いている間、実際にはCとsetuid-rootで書かれていました)。
mknod d $1
ln -d $1 $1/.
ln -d `dirname $1` $1/..
ご覧のとおり、にはそれほど特別な点はありません。および..それらがmkdirによって作成され、すでに存在するという事実を除いて。削除できないというコードが表示されていますが、常にそうであるとは限りません。
rmdirは次のように表示されていました。
rm -d $1/..
rm -d $1/.
rm -d $1