ฉันจะตรวจสอบว่าไฟล์เป็นลิงค์สัญลักษณ์ไปยังไดเรกทอรีได้อย่างไร?


64

ฉันสามารถตรวจสอบได้ว่ามีไฟล์อยู่หรือไม่และเป็นลิงก์สัญลักษณ์ที่มี -L

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

และถ้ามันเป็นไดเรกทอรีที่มี -d:

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

แต่ฉันจะทดสอบเฉพาะลิงก์ไปยังไดเรกทอรีได้อย่างไร


ฉันจำลองทุกกรณีในโฟลเดอร์ทดสอบ:

/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'

คำตอบ:


75

เพียงแค่รวมการทดสอบสองข้อเข้ากับ&&:

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

1
หากคุณต้องการตรวจสอบไฟล์และไดเรกทอรีที่ซ่อนอยู่ให้นำหน้าสิ่งนี้ก่อน:shopt -s dotglob
rubo77

2
[-L "$ file"] && [-d "$ file"] ไม่ดีกว่าเหรอ? บางอย่างที่มีความสามารถในการพกพาระหว่างเชลล์ iirc
Lennart Rolland

3
@Lennart รหัสตัวอย่างของ OP ใช้[[และฉันเอาว่าเป็นจุดเริ่มต้นตรรกะ การสนทนาเกี่ยวกับข้อดีของ[vs [[อยู่นอกขอบเขตสำหรับคำตอบนี้ (แต่มีให้ที่นี่ )


1

โซลูชันที่มีfindและใช้ฟังก์ชัน:

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

การใช้findและสิ่งwhile readที่เกินความจริง ...
Camilo Martin

1
ค้นหามีประโยชน์จริง ๆ ถ้าคุณค้นหาเฉพาะบางไฟล์
rubo77
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.