2011-11-08 30 views
35

Tôi chạy find và lặp qua các kết quả với [ \(-L $F \) ] để thu thập các liên kết tượng trưng nhất định.Làm cách nào để phát hiện xem một liên kết tượng trưng có bị hỏng trong Bash không?

Tôi tự hỏi nếu có một cách dễ dàng để xác định xem liên kết có bị hỏng hay không (chỉ vào tệp không tồn tại) trong trường hợp này.

Đây là mã của tôi:

FILES=`find /target/ | grep -v '\.disabled$' | sort` 

for F in $FILES; do 
    if [ -L $F ]; then 
     DO THINGS 
    fi 
done 

Trả lời

39
# test if file exists (test actual file, not symbolic link) 
if [ ! -e "$F" ] ; then 
    # code if the symlink is broken 
fi 
+0

Lưu ý rằng mã cũng sẽ được thực thi nếu tệp đó không tồn tại. Nó là tốt với 'find' nhưng trong các kịch bản khác (như globs) nên được kết hợp với -h để xử lý trường hợp này, ví dụ' [-h "$ F" -a! -e "$ F"] '. – Calimo

+0

Bạn không thực sự thử nghiệm liên kết tượng trưng với cách tiếp cận này. –

+0

@Calimo Không có sự khác biệt. – Melab

7

readlink -q sẽ thất bại âm thầm nếu liên kết là xấu:

for F in $FILES; do 
    if [ -L $F ]; then 
     if readlink -q $F >/dev/null ; then 
      DO THINGS 
     else 
      echo "$F: bad link" >/dev/stderr 
     fi 
    fi 
done 
+0

điều này có vẻ khá đẹp vì điều này chỉ trả về true nếu tệp thực sự là một liên kết tượng trưng. Nhưng ngay cả khi thêm -q, readlink xuất ra tên của liên kết trên Linux. Nếu đây là trường hợp nói chung có thể câu trả lời nên được cập nhật với 'readlink -q $ F> dev/null'. Hay tôi đang thiếu một cái gì đó? – zoltanctoth

+1

Không, bạn nói đúng. Sửa chữa, cảm ơn. –

+0

Phiên bản nào? Tôi không thấy hành vi này trên hệ thống của mình readlink --version readlink (coreutils) 5.2.1 –

26

này nên in ra các liên kết được chia:

find /target/dir -type l ! -exec test -e {} \; -print 

Bạn cũng có thể tham gia hoạt động với lệnh find, ví dụ: xóa các liên kết bị hỏng:

find /target/dir -type l ! -exec test -e {} \; -exec rm {} \; 
2

Nếu bạn không nhớ đi qua liên kết tượng trưng dir không bị hỏng, để tìm tất cả các liên kết mồ côi:

 
$ find -L /target -type l | while read -r file; do echo $file is orphaned; done 

Để tìm tất cả các file mà không phải là mồ côi liên kết:

 
$ find -L /target ! -type l 
+1

Nhưng điều này theo sau các liên kết không bị hỏng đối với các thư mục mà chúng tôi có thể không muốn. – rafak

5

này sẽ hoạt động nếu liên kết tượng trưng đã được trỏ đến một tập tin hoặc một thư mục, nhưng bây giờ bị phá vỡ

if [[ -L "$strFile" ]] && [[ ! -a "$strFile" ]];then 
    echo "'$strFile' is a broken symlink"; 
fi 
2

Điều này tìm tất cả các tệp thuộc loại "liên kết", cũng có thể giải quyết thành loại "liên kết". I E. một liên kết bị hỏng

find /target -type l -xtype l 
+1

biến thể: 'find -L/target -type l' – cdelacroix

+0

Bạn không thể có liên kết tượng trưng với liên kết tượng trưng không bị hỏng? ' –

Các vấn đề liên quan