Unix: Chém sau tên thư mục hay không


13

Sự khác biệt giữa các lệnh sau là gì?

mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/

Hay là không có sự khác biệt? Hay nó phụ thuộc vào lệnh đang được sử dụng? Hãy suy nghĩ ví dụ tôi đọc rằng hành vi rsync thay đổi một chút tùy thuộc vào phiên bản bạn sử dụng. Có ai có một lời giải thích tốt vì vậy tôi không phải đoán nữa và cảm thấy như tôi biết những gì tôi đang làm?


2
Điều đó đúng với rsync. Nó bắt đầu sao chép bằng chính thư mục hoặc với các mục bên dưới nó, tùy thuộc vào việc bạn bỏ qua hoặc thêm dấu gạch chéo tương ứng.
tối đa

@maxelost: Bạn có thể thêm câu trả lời với một số ví dụ để nó rõ ràng không?
Svish

Mikel trả lời khá rõ ràng bên dưới, tôi nghĩ vậy.
tối đa

Câu trả lời:


17

Nhiều tiện ích Unix xử lý các liên kết tượng trưng khác nhau tùy thuộc vào việc có dấu gạch chéo hay không.

Hành vi này được mô tả trong tài liệu Liên kết tượng trưng POSIX và cũng được đề cập trong tài liệu GNU coreutils .

Về cơ bản, dấu gạch chéo có nghĩa là đi theo (hoặc "dereference") liên kết tượng trưng.

Ví dụ, trong đoạn mã dưới đây, dirlinkcó nghĩa là symlink, nhưng dirlink/có nghĩa là thư mục mà symlink trỏ tới. rmsẽ không xóa thư mục trừ khi bạn nói rm -r, nhưng rmkhông có tùy chọn sẽ vui vẻ xóa liên kết tượng trưng.

$ mkdir dir
$ ln -s dir dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ rm dirlink/
rm: cannot remove `dirlink/': Is a directory
$ rm dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir

Nó cũng hữu ích để xem các quyền của một thư mục, mà không phải bận tâm liệu thư mục đó là một thư mục thực hay chỉ là một liên kết tượng trưng đến một thư mục.

$ ls -ld dirlink
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:46 dirlink -> dir
$ ls -ld dirlink/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dirlink/

và nó vẫn hoạt động cho các thư mục thông thường:

$ ls -ld dir
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir
$ ls -ld dir/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir/

Một ví dụ khác là findlệnh. Nếu pathbạn yêu cầu nó tìm kiếm trong một liên kết tượng trưng, ​​thì nó sẽ không theo liên kết tượng trưng theo mặc định, nghĩa là nó chỉ xử lý liên kết tượng trưng. Thêm một dấu gạch chéo làm cho nó coi symlink là thư mục mà liên kết trỏ tới.

$ find dir
dir
dir/file
$ find dirlink
dirlink
$ find dirlink/
dirlink/
dirlink/file

(một số phiên bản tìm kiếm có một -followhoặc -Ltùy chọn, nhưng điều đó làm cho nó tuân theo tất cả các liên kết tượng trưng, ​​không chỉ phiên bản đầu tiên)


Trong trường hợp rsync, việc bạn có nên thêm dấu gạch chéo hay không phụ thuộc vào việc bạn có muốn thư mục bạn sao chép là thư mục con hay không.

$ mkdir dir
$ touch dir/file
$ rsync -r dir dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/dir
./dir.bak/dir/file
$ rm -r dir.bak
$ rsync -r dir/ dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/file

Nói cách khác:

  • rsync dir dir.bakbản sao dirvào dir.bak, làm dirbên trongdir.bak
  • rsync dir/ dir.baksao chép tất cả nội dung của dir, mà không cần thực hiện dirbên trongdir.bak

2

Như jsalonen đã nói, các lệnh này thực sự có kết quả giống hệt nhau nếu foobarthực tế là các thư mục.

Tuy nhiên, nếu foobarkhông phải là thư mục, thì lệnh sẽ thất bại nếu bạn thêm dấu gạch chéo và sẽ thành công nếu bạn không. Điều đó là, nếu lệnh thành công, nó có thể sẽ không có kết quả như bạn dự định. Trong thực tế, bạn thậm chí có thể mất dữ liệu nếu foobarlà các tệp ( barsẽ bị ghi đè).

Nếu ý định của bạn là chỉ định các thư mục và không phải các tệp, thì bạn nên sử dụng dấu gạch chéo, bởi vì nó làm cho lệnh mạnh mẽ hơn: nếu kỳ vọng đó là foohoặc barcác thư mục bị lỗi, thì lệnh sẽ thất bại, thay vì có kết quả không mong muốn.

Ngoài ra, một số lệnh (hiếm) hoạt động khác nhau tùy thuộc vào sự hiện diện của dấu gạch chéo, ngay cả với các thư mục (một ví dụ là rsync).


Vâng, như tôi đã ngụ ý các lệnh có thể hoặc không thể xử lý các dấu gạch chéo. Thật tốt khi bạn cung cấp rsync làm ví dụ!
jsalonen
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.