Làm cách nào để kiểm tra xem một tập tin có phải là một liên kết tượng trưng đến một thư mục không?


64

Tôi có thể kiểm tra, nếu một tệp tồn tại và là một liên kết tượng trưng với -L

for file in *; do
    if [[ -L "$file" ]]; then echo "$file is a symlink"; else echo "$file is not a symlink"; fi
done

và nếu nó là một thư mục có -d:

for file in *; do
    if [[ -d "$file" ]]; then echo "$file is a directory"; else echo "$file is a regular file"; fi
done

Nhưng làm thế nào tôi có thể kiểm tra chỉ liên kết đến thư mục?


Tôi mô phỏng tất cả các trường hợp trong một thư mục thử nghiệm:

/tmp/test# ls
a  b  c/  d@  e@  f@

/tmp/test# file *
a: ASCII text
b: ASCII text
c: directory
d: symbolic link to `c'
e: symbolic link to `a'
f: broken symbolic link to `nofile'

Câu trả lời:


75

Chỉ cần kết hợp hai bài kiểm tra với &&:

if [[ -L "$file" && -d "$file" ]]
then
    echo "$file is a symlink to a directory"
fi

1
Nếu bạn muốn kiểm tra các tập tin và thư mục ẩn quá trước thì:shopt -s dotglob
rubo77

2
Không phải [-L "$ file"] && [-d "$ file"] tốt hơn sao? Một cái gì đó với tính di động giữa các vỏ iirc.
Lennart Rolland

3
Mã ví dụ của @Lennart OP sử dụng [[và tôi lấy đó làm điểm bắt đầu hợp lý. Một cuộc thảo luận về giá trị của [vs [[nằm ngoài phạm vi của câu trả lời này (nhưng có sẵn ở đây ).


1

Một giải pháp với findvà sử dụng một chức năng:

dosomething () {
    echo "doing something with $1"; 
}
find -L -path './*' -prune -type d| while read file; do 
    if [[ -L "$file" && -d "$file" ]];
        then dosomething "$file";
    fi; 
done

Sử dụng findwhile readcho điều đó là quá mức cần thiết ...
Camilo Martin

1
Tìm kiếm thực sự hữu ích nếu bạn chỉ tìm kiếm một số tệp nhất định
rubo77
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.