Làm thế nào tôi có thể liệt kê các tập tin không có liên kết tượng trưng?


10

Tôi có một thư mục "myfiles" lớn chứa đầy các tài liệu linh tinh và không muốn sửa đổi cấu trúc của nó.

Do đó tôi đã tạo (một số) thư mục khác cho mỗi loại tài liệu. Ví dụ: tôi có một thư mục "hình ảnh" có liên kết tượng trưng cho từng .jpghoặc .cr2tệp trong thư mục "myfiles" cộng với các tệp mô tả khác cho mỗi liên kết tượng trưng (có cùng tên tệp) với mô tả và siêu dữ liệu khác. Các liên kết tượng trưng trong thư mục / hình ảnh có thể có một tên khác với tệp được liên kết ban đầu.

Tôi đang cố gắng tìm cách đơn giản nhất để đảm bảo mỗi tệp hình ảnh trong thư mục "myfiles" có một liên kết tượng trưng vào thư mục "hình ảnh".

Xem ví dụ về cấu trúc thư mục

/myfiles/a.doc
/myfiles/b.jpg
/myfiles/c.cr2
/myfiles/d.mov

nên kết quả

/images/b_800x600.jpg
/images/b_800x600.desc
/images/c_3820x5640.cr2
/images/c_3820x5640.cr2

Không phải là một câu trả lời đầy đủ nhưng bạn có thể lưu kết quả của một find /myfiles -type ftệp vào một tệp sau đó sử dụng find /images -type l -exec readlink {} \; | egrep myfilesđể lấy danh sách các tệp được /imagesliên kết sedvới nhau sau đó lặp lại các kết quả đang thực hiện trên từng tệp để xóa các đường dẫn trong tệp đầu tiên bạn lưu vì chúng đã lưu có các liên kết tượng trưng và các tệp còn lại là các tệp không có liên kết tượng trưng.
Bratchley

2
Có thể cho bạn sử dụng liên kết cứng thay thế, vì vậy bạn có thể sử dụng bộ đếm liên kết cứng để xem bạn có liên kết không? Sử dụng ls -lbạn có thể thấy số lượng liên kết cứng trong cột thứ hai.
Lambert

Làm những gì @Lambert nói. rmnhững thư mục symlink đó và sử dụng pax -rwl -s "\|.*regex|modifes_filename|" /path/to/myfiles/*.jpg /path/to/jpg_dirví dụ để lấy các liên kết cứng với tên tệp được thay đổi theo chương trình chỉ dành cho những tệp phù hợp với jpg của bạn. Bạn có thể nhận được nhiều hơn thế - từ việc tạo khối dựa trên thời gian thay đổi, v.v.
mikeerv 28/03/2015

Câu trả lời:


6

Nếu tôi trả lời đúng câu hỏi, bạn cần các tệp trong tệp myfiles không có liên kết tượng trưng trong hình ảnh:

#!/bin/bash

OIFS="$IFS"
IFS=$'\n'

files="$(find myfiles/ -type f -name '*.jpg' -or -name '*.cr2')"
for f in $files; do
    list="$(find -L images/ -xtype l -samefile "$f")"
    if [[ "$list" == "" ]]; then
        echo "$f does not have symlink."
    fi
done

IFS="$OIFS"

Có một sự cảnh báo với cách tiếp cận này nếu bạn có tệp a.jpg trong thư mục myfiles / 1 và bạn có một liên kết tượng trưng đến tệp đó trong thư mục hình ảnh / 3 hoặc đơn giản là trong hình ảnh / tệp sẽ không được báo cáo khi thiếu symlink.


Cảm ơn ! Có bạn đã hiểu chính xác. Gần nhưng không hẳn. Lỗi của tôi không có của bạn :-) Ví dụ tôi đưa ra cho thấy một thư mục myfiles đơn giản. Trong thực tế, các tệp hình ảnh dưới myfiles có thể nằm trong bất kỳ cấp độ tùy ý nào của các thư mục lồng nhau.
Robert Alexander

Tôi đã chỉnh sửa câu trả lời để tìm kiếm trong toàn bộ myfiles, nhưng kiểm tra xem đây có phải là điều bạn mong muốn không.
Taliezin 28/03/2015

CÒN Ở đó :-) Kịch bản của bạn bị trục trặc khi các tệp có khoảng trắng (và có thể các crap khác như dấu nháy đơn "trong đó ...
Robert Alexander

Tôi nghĩ bây giờ nó sẽ ổn thôi
Taliezin 28/03/2015

Sửa đổi cuối cùng của bạn chia tách mỗi f tại sự xuất hiện của mỗi chữ n! :-) Tôi đã viết dòng IFS thành IFS = sau đó là một dòng mới từ bàn phím rồi ". "
Robert Alexander

3

Tôi giả sử rằng các tệp bên dưới myfileskhông phải là liên kết tượng trưng và không có tên tệp nào chứa dòng mới. (Cách tiếp cận của tôi vẫn có thể hoạt động nếu các giả định này bị vi phạm nhưng nó phức tạp hơn.) Tôi cũng cho rằng bạn có readlinktiện ích chung và nó hỗ trợ -fđể chuẩn hóa các đường dẫn, đó là trường hợp trên Linux (cả GNU và BusyBox), nhưng không ví dụ như OSX.

Xây dựng một danh sách các tập tin và sắp xếp nó cho các biện pháp tốt:

find /myfiles -type f -print | sort >all.list

Xây dựng một danh sách các mục tiêu liên kết tượng trưng, ​​với các đường dẫn tuyệt đối.

find /images -type f -exec readlink -f {} \; | sort >linked.list

Liệt kê các tệp không được liên kết:

comm -32 all.list linked.list

Nếu bạn sử dụng trình bao hỗ trợ thay thế quy trình, bạn có thể đặt tất cả trong một lệnh:

comm -23 <(find /myfiles -type f -print | sort) \
         <(find /images -type f -exec readlink -f {} \; | sort)

Nếu các liên kết bên dưới /imageslà tuyệt đối, bạn có thể sử dụng readlinkmà không có -ftùy chọn, có sẵn trong * BSD và OSX.


Tôi đã định đăng một cái gì đó giống như commlệnh của bạn nhưng bây giờ tôi sẽ không thấy bạn đã làm. Tuy nhiên, chuyển hướng từ sortkhông có ý nghĩa; sau đó các quá trình thay thế sẽ không xuất ra bất cứ điều gì. Ngoài ra, bạn có thể thêm nhiều thư mục bên cạnh /imagesnếu bạn muốn tìm các tệp /myfileskhông được liên kết với nhau từ bất kỳ thư mục nào bên cạnh /images.
tripleee

1
Xem stackoverflow.com/questions/7665/ trên để biết các lựa chọn thay thế choreadlink -f
tripleee 28/03/2015

@tripleee Tôi quên mất việc chuyển hướng khi tôi xây dựng phiên bản chuyển hướng quy trình, cảm ơn. Có, bạn có thể dễ dàng thêm các thư mục khác hoặc thực hiện các biến thể khác.
Gilles 'SO- ngừng trở thành ác quỷ'
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.