Làm cách nào để đổi tên tập tin thành .. (dấu chấm)?


26

Rõ ràng bạn có thể đổi tên tập tin thành... .

Nếu tôi mất trí, tôi sẽ đổi tên tập tin thành ..hay .? Là một tên tệp như vậy thậm chí được phép?

Dấu gạch chéo ngược dường như không tắt ý nghĩa đặc biệt của dấu chấm:

$ mv test \.
mv: `test' and `./test' are the same file

11
...đã tồn tại. Và dấu chấm không có ý nghĩa đặc biệt.
ctrl-alt-delor

2
Tôi tự hỏi nếu bạn có thể tạo các tệp có tên .hoặc ..từ Windows lên bên ngoài FAThoặc NTFSphương tiện truyền thông, sau đó thử gắn nó vào hệ thống dựa trên Unix. Hừm ...
IQAndreas

3
@IQAndreas không, Windows sử dụng. và .. về cùng một cách ( superuser.com/a/571364/330318 ) như Unix hiện. (Và rất nhiều tên đặc biệt khác: superuser.com/a/217526/330318 )
PTwr

2
@PTwr Câu chuyện về windows khó hơn thế. Một số điều đặc biệt xảy ra ở cấp hệ thống tệp / cấp API NT, một số trong hệ thống con Win32 và một số và cấp độ vỏ. Ví dụ, ma thuật GUID từ liên kết thứ hai của bạn ở cấp độ vỏ, vì vậy bạn sẽ không thấy chúng trong một ứng dụng dòng lệnh thông thường. Tôi không chắc chắn nếu ...thực sự tồn tại trong NTFS và API NT hay nếu chúng chỉ được thêm bởi API Win32. Tôi biết rằng có một số khác biệt giữa API NT cấp thấp hơn và Win32, ví dụ Win32 ẩn một số tệp từ gốc ổ đĩa.
CodeInChaos

@CodesInChaos theo như tôi biết dot / dotdot là các trường hợp ảo và được mô phỏng trong trình điều khiển hệ thống tệp, và nó cũng giống như trong FAT cũ đã mượn ý tưởng ( có vấn đề ) từ Unix. Theo liên kết thứ hai, tôi thừa nhận không đọc nó đầy đủ trước khi đăng. Một cái gì đó như thế này có lẽ sẽ tốt hơn. (nhưng một lần nữa, cái này thiếu đầy đủ ./ .. thông tin)
PTwr

Câu trả lời:


25

.. không có gì đặc biệt, chỉ là nó đã tồn tại

Trên Unix, Dos và MS-Windows, mọi thư mục đều có một thư mục .mà nó liên kết lại với chính nó và một thư mục.. mà nó liên kết đến thư mục mẹ của nó (hoặc thư mục gốc nếu thư mục gốc).

Nếu ... đặc biệt thì chỉ vì bạn không thể xóa chúng (thực ra bạn có thể, bạn chỉ cần xóa thư mục chứa chúng).

Do đó, bạn không thể đặt tên cho bất kỳ tệp (khác) .hoặc.. .

Tuy nhiên bạn có thể tạo các file ..., \, , .. (lưu ý có một không gian sau .., nhưng bạn khó có thể nhìn thấy nó ở đây, hoặc dễ dàng trong bạn danh sách thư mục) hoặc bất kỳ tên khác mà bạn tương tự; Ký tự dành riêng duy nhất/(Cảnh báo - chi tiết nâng cao: và null, null là ký tự đặc biệt, không được sử dụng cho bất cứ điều gì ngoại trừ để đánh dấu sự kết thúc của mọi thứ và đôi khi là dấu phân cách). .không có ý nghĩa đặc biệt: không để tên tập tin, kernel hoặc shell, nó không cần thoát. Trên thực tế nếu một tên tệp bắt đầu bằng một .thì nó là đặc biệt, tệp thường bị ẩn, nhưng nó vẫn không cần thoát.

Qua một bên

Hành vi tệp ẩn này xuất hiện trong một triển khai sớm về lsnơi tác giả muốn ẩn ...vì vậy họ đã viết mã để ẩn bất kỳ tệp nào bắt đầu bằng a .. Những người dùng khác nhận thấy lỗi / tính năng này và bắt đầu tạo tệp bắt đầu từ .khi họ muốn tệp bị ẩn.

Giải thích câu hỏi liên kết

Trong câu hỏi bạn liên kết đến người hỏi đang cố gắng di chuyển tệp vào thư mục mẹ ..nhưng cuối cùng đổi tên thành ..., các tệp bắt đầu bằng dấu chấm theo mặc định bị ẩn, đó là lý do tại sao họ không thể tìm thấy tệp.

Khi sử dụng mv theo mẫu mv a b

  • Nếu bạn di chuyển đến .đó thực sự là một hoạt động không có, nhưng mvcoi nó là một lỗi.
  • Nếu bạn di chuyển đến ..nó sẽ di chuyển tệp vào thư mục cha.

1
Bạn có ý nghĩa If you move to . it is effectively a no operationgì? Đó không phải là "không op", đó là lỗi nếu bạn cố di chuyển tệp từ A sang B khi A và B giống nhau. Chứng minh thực tế hơn về lỗi này là mv foo ../some_dir/foohoặc mv foo some_subdir/../foo.
Brandin

7
Đối với một số định nghĩa về 'ký tự', NUL (0x00) cũng bị hạn chế sử dụng trong tên tệp và thư mục.
dùng117529

1
Sự khác biệt giữa ký tự dành riêng (tức là /và NUL) và tên dành riêng (tức là ...) có thể được làm rõ hơn. Ngoài ra, điều đáng nói là .ở đầu tên chỉ có ý nghĩa đặc biệt ở lớp ứng dụng chứ không phải trong API gọi kernel hoặc hệ thống.
kasperd

Tôi nghĩ rằng không gian của bạn đã bị mất.
nyuszika7h

1
... đặc biệt: bạn không thể di chuyển hoặc loại bỏ chúng. Nhưng chúng không đặc biệt khi di chuyển tệp đến chúng.
Revierpost

52

Bạn không thể đổi tên một tệp thành .hoặc ..bởi vì tất cả các thư mục đã chứa các mục nhập cho hai tên đó. (Những mục này trỏ đến thư mục và bạn không thể đổi tên tệp thành thư mục.)

mv phát hiện trường hợp đích đến là một thư mục hiện có và diễn giải nó như một yêu cầu di chuyển tệp vào thư mục đó (sử dụng tên hiện tại của nó).

Dấu gạch chéo ngược không có gì để làm với điều này, vì .không phải là một siêu vi khuẩn vỏ. \..đều giống nhau đến bash.


9

Vấn đề là bạn đang di chuyển một tập tin vào một thư mục. Điều này được phép thất bại.

Tôi sẽ nói cho bạn biết nó đã từng như thế nào.

mkdir trước đây thường đọc nó (trong khi tôi viết nó bằng sh, nó thực sự được viết bằng C và setuid-root).

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

Vì vậy, như bạn có thể thấy không có nhiều đặc biệt về. và .. ngoại trừ thực tế chúng được tạo ra cho bạn bởi mkdir và đã tồn tại. Hiện tại có mã nói rằng bạn không thể xóa chúng, nhưng không phải lúc nào cũng như vậy.

rmdir đã từng trông như thế này:

rm -d $1/..
rm -d $1/.
rm -d $1

+1 cho bài học lịch sử và thêm một cái gì đó không được bảo hiểm đúng.
ctrl-alt-delor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.