Câu hỏi Làm thế nào tôi có thể tìm thấy sự khác biệt giữa một thư mục và một liên kết thư mục trong Ubuntu?


Trước đó, tôi đã tạo một số liên kết đến một thư mục khác bằng lệnh sau đây.

sudo ln -s path_name link_name 

Các liên kết này trông giống như các thư mục. Tôi không thể phân biệt giữa một thư mục và một liên kết. Có cách nào để tìm sự khác biệt giữa một thư mục và một liên kết đến một thư mục khác không?


4
2018-02-13 05:44


gốc


khi tôi gõ lệnh ls, tôi thấy tên thư mục có màu khác nhau. Liên kết được hiển thị bằng màu xanh dương hay là thư mục hiển thị màu xanh? - mateen
Tôi làm việc trong terminal.No GUI: (tôi không được phép sử dụng một trình soạn thảo GUI. - mateen
Đó là những màu xanh lam / xanh nhạt (xem askubuntu.com/a/17304/72216) - Jacob Vlijm
cảm ơn câu trả lời tôi đang tìm kiếm. nhưng bạn có biết bất kỳ cách nào khác thay vì màu sắc, như chúng ta có thể tìm thấy các thuộc tính của thư mục cho thấy đó là một liên kết và một thư mục? - mateen
ls -l hiển thị một -> Đó có phải là ý bạn không? - Jacob Vlijm


Các câu trả lời:


Bạn có thể nhận ra một liên kết bằng một mũi tên nhỏ (->) trong đầu ra của ls -l:

enter image description here

hoặc bằng màu phân biệt, cũng xuất hiện ở đầu ra của ls, như được mô tả trong câu trả lời này (test2 là liên kết):

enter image description here


5
2018-02-13 06:27



đây là cái được gọi là câu trả lời cắt-cắt. Cảm ơn - mateen
hoặc bằng "l" ở đầu dòng với các quyền - Jean-Marie
@ Jean-Marie làm thế nào tôi có thể quên đề cập đến, tất nhiên! Đó là câu trả lời của terdon, cùng với một số lượng lớn các lựa chọn hoàn hảo khác. - Jacob Vlijm


Có nhiều cách để thấy điều này. Trước hết, nó được chỉ định trong đầu ra của ls -l. Lưu ý rằng thư mục có d ở đầu trường quyền trong khi liên kết có l:

$ ls -l
drwxr-xr-x 2 terdon terdon 4096 Feb 13 14:12 bar
lrwxrwxrwx 1 terdon terdon    3 Feb 13 14:12 foo -> bar

Bạn cũng có thể dùng file:

$ file bar foo 
bar: directory 
foo: symbolic link to `bar' 

Một lựa chọn khác là readlink theo các liên kết tượng trưng đến mục tiêu của chúng:

$ readlink foo
bar

Đang chạy readlink bar sẽ không trả về kết quả đầu ra (nó không thành công, trả lại mã thoát 0), vì vậy bạn có thể làm một cái gì đó như:

readlink bar || echo "Not a link!"

hoặc là

readlink foo && "Echo this is a link"

Cuối cùng, bạn cũng có thể sử dụng find hoặc chính vỏ đó để liệt kê tất cả các liên kết:

find . -type l

hoặc là

for f in *; do [ -L "$f" ] && echo "$f is a link"; done

6
2018-02-13 12:20



waoow có rất nhiều cách! cám ơn vì đã chia sẻ - mateen


Đọc man [ (hoặc là man test) và bạn sẽ thấy bạn có thể làm:

for theDir in path_name link_name ; do  
    if [ -L $theDir ] ; then  
        echo "$theDir exists and is a symbolic link"   
    elif [ -d $theDir ] ; then  
        echo "$theDir exists and is a directory"  
    fi  
done

Tôi đã thay đổi thứ tự các bài kiểm tra, vì vậy việc kiểm tra thư mục chỉ được thực hiện nếu $theDir không phải là một liên kết.


2
2018-02-13 05:54



Điều này không hoạt động. if [ -d $theDir ] trả về true nếu đích của liên kết là một thư mục. - terdon♦
@terdon tôi đã sửa nó. - waltinator


sử dụng ls -F .

điều này sẽ làm cho ls nối thêm các ký tự vào tên tập tin

* cho các tệp thi hành

/ cho thư mục

@ cho các liên kết tượng trưng **

| cho FIFO

> cho cửa ra vào (bất kể điều này có nghĩa là gì)

= cho ổ cắm

các tệp thông thường không có trình phân loại ở cuối. Vì vậy, trong trường hợp của bạn, bạn sẽ thấy @ ở cuối mỗi tên liên kết tượng trưng và / ở cuối thư mục thực.

Tuy nhiên nếu bạn sử dụng ls -l bạn sẽ không thấy các trình phân loại cho các liên kết tượng trưng và thay vào đó bạn sẽ thấy -> và liên kết mục tiêu sau đó.

Bạn cũng có thể dùng stat và file để phân biệt các thư mục / symlink ví dụ:

$ file a                                                                                                                                                                                     
a: directory

$ file b                                                                                                                                                                                      
b: symbolic link to a

$ stat a                                                                                                                                                                                  
  File: 'a'
  Size: 40          Blocks: 0          IO Block: 4096   directory
 [...]

$ stat b                                                                                                                                                                                    
  File: 'b' -> 'a'
  Size: 1           Blocks: 0          IO Block: 4096   symbolic link
  [...]

1
2018-02-13 16:29