Bagaimana cara mengganti nama file menjadi .. (dot dot)?

26

Tampaknya Anda dapat mengubah nama file menjadi... .

Jika saya gila, bagaimana saya mengganti nama file menjadi ..atau .? Apakah nama file seperti itu bahkan diizinkan?

Backslash tampaknya tidak menonaktifkan makna khusus dot:

$ mv test \.
mv: `test' and `./test' are the same file
gronostaj
sumber
11
.dan ..sudah ada. Dan dot tidak memiliki arti khusus.
ctrl-alt-delor
2
Saya ingin tahu apakah Anda dapat membuat file bernama .atau ..dari Windows ke eksternal FATatau NTFSmedia, kemudian mencoba untuk me-mount itu ke sistem berbasis Unix. Hm ...
IQAndreas
3
@IQAndreas tidak, Windows menggunakan. dan .. tentang cara yang sama ( superuser.com/a/571364/330318 ) seperti yang dilakukan Unix. (Dan banyak nama khusus lainnya: superuser.com/a/217526/330318 )
PTwr
2
@ PTw Cerita windows lebih rumit dari itu. Beberapa hal khusus terjadi pada level sistem file / level NT API, beberapa di subsistem Win32 dan beberapa dan level shell. Misalnya sihir GUID dari tautan kedua Anda berada pada level shell, jadi Anda tidak akan melihatnya di aplikasi baris perintah yang khas. Saya tidak yakin apakah .dan ..benar - benar ada di NTFS dan NT API atau jika mereka hanya ditambahkan oleh Win32 API. Saya tahu bahwa ada beberapa perbedaan antara NT API tingkat lebih rendah dan Win32, misalnya Win32 menyembunyikan beberapa file dari root drive.
CodesInChaos
@ CodeInChaos sejauh yang saya tahu dot / dotdot adalah contoh virtual dan ditiru dalam driver sistem file, dan itu sama dengan FAT lama yang meminjam ide ( bermasalah ) dari Unix. Per tautan kedua, saya akui tidak membacanya sepenuhnya sebelum memposting. Sesuatu seperti ini mungkin akan lebih baik. (tapi sekali lagi, yang ini kurang lengkap ./ .. info)
PTwr

Jawaban:

25

.. tidak spesial, hanya saja sudah ada.

Pada Unix, Dos, dan MS-Windows setiap direktori memiliki direktori .yang ditautkan kembali ke dirinya sendiri, dan direktori ..yang ditautkan ke direktori induknya (atau self jika direktori root).

Jika ..dan .istimewa itu hanya karena Anda tidak dapat menghapusnya (sebenarnya Anda bisa, Anda cukup menghapus direktori yang berisi mereka).

Karenanya Anda tidak dapat memberi nama file (lainnya) .atau ...

Namun Anda dapat membuat file ..., \, , .. (catatan ada ruang setelah .., tetapi Anda tidak bisa melihatnya di sini, atau dengan mudah di dalam kamu daftar direktori) atau nama lain yang Anda seperti; Satu- satunya karakter yang dilindungi undang-undang adalah /(Peringatan - perincian lanjut: dan null, null adalah karakter khusus, tidak digunakan untuk apa pun kecuali untuk menandai bagian akhir dan terkadang sebagai pemisah). .tidak memiliki arti khusus: tidak untuk mengajukan nama, kernel atau ke shell, tidak perlu melarikan diri. Sebenarnya jika nama file dimulai dengan .maka itu khusus, file tersebut biasanya disembunyikan, tetapi tetap saja tidak perlu melarikan diri.

Ke samping

Perilaku file tersembunyi ini muncul dalam implementasi awal di lsmana penulis ingin menyembunyikan .dan .., jadi mereka menulis kode untuk menyembunyikan file yang dimulai dengan a .. Pengguna lain memperhatikan bug / fitur ini dan mulai membuat file dimulai dengan .ketika mereka ingin file tersebut disembunyikan.

Penjelasan pertanyaan Linked

Dalam pertanyaan yang Anda tautkan ke penanya mencoba untuk memindahkan file ke direktori induk ..tetapi akhirnya berganti nama menjadi ..., file yang dimulai dengan titik secara default disembunyikan, itu sebabnya mereka tidak dapat menemukannya.

Saat menggunakan mv dalam formulir mv a b

  • Jika Anda pindah ke .sana secara efektif operasi tidak, tetapi mvmemperlakukannya sebagai kesalahan.
  • Jika Anda pindah ke ..sana akan memindahkan file ke direktori induk.
ctrl-alt-delor
sumber
1
Apa maksudmu If you move to . it is effectively a no operation? Ini bukan "no op" itu adalah kesalahan jika Anda mencoba untuk memindahkan file dari A ke B ketika A dan B adalah hal yang sama. Demonstrasi yang lebih praktis dari kesalahan ini adalah mv foo ../some_dir/fooatau mv foo some_subdir/../foo.
Brandin
7
Untuk beberapa definisi 'karakter', NUL (0x00) juga dibatasi untuk digunakan dalam nama file dan direktori.
user117529
1
Perbedaan antara karakter yang dipesan (yaitu /dan NUL) dan nama yang dipesan (yaitu .dan.. ) dapat dibuat lebih jelas. Juga perlu ditunjukkan bahwa .pada awal nama hanya memiliki arti khusus pada lapisan aplikasi dan tidak dalam API panggilan sistem atau kernel.
kasperd
Saya pikir ruang Anda hilang.
nyuszika7h
1
..dan . yang khusus: Anda tidak dapat memindahkan atau menghapusnya. Tetapi mereka tidak istimewa ketika memindahkan file ke mereka.
Reinierpost
52

Anda tidak dapat mengganti nama file menjadi .atau ..karena semua direktori sudah berisi entri untuk kedua nama tersebut. (Entri tersebut menunjuk ke direktori, dan Anda tidak dapat mengganti nama file ke direktori.)

mv mendeteksi kasus di mana tujuan adalah direktori yang ada, dan menafsirkannya sebagai permintaan untuk memindahkan file ke direktori itu (menggunakan nama saat ini).

Backslash tidak ada hubungannya dengan ini, karena .bukan metacharacter shell. \.dan .sama dengan bash.

cjm
sumber
9

Masalahnya adalah Anda memindahkan file ke direktori. Ini dibiarkan gagal.

Saya akan memberi tahu Anda bagaimana dulu.

mkdir pada dasarnya membaca ini (sementara saya menulis ini di sh, itu benar-benar ditulis dalam C dan setuid-root).

mknod d $1
ln -d $1 $1/.
ln -d `dirname $1` $1/..

Jadi seperti yang Anda lihat, tidak banyak yang spesial. dan .. kecuali untuk fakta mereka diciptakan untuk Anda oleh mkdir dan sudah ada. Ada kode sekarang yang mengatakan Anda tidak dapat menghapusnya, tetapi tidak selalu demikian.

rmdir dulu terlihat seperti ini:

rm -d $1/..
rm -d $1/.
rm -d $1
Joshua
sumber
+1 untuk pelajaran sejarah, dan menambahkan sesuatu yang tidak tercakup dengan benar.
ctrl-alt-delor