Câu trả lời:
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
sẽ làm việc. Có thể có một cách thanh lịch hơn.
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;
nếu không thì hàm thực thi chỉ áp dụng cho phần cuối cùng ( -iname '*.jpg'
trong trường hợp này).
find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0
sẽ chỉ in các tập tin jpg! Bạn cần ngoặc ở đây:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log
Việc -E
tiết kiệm cho bạn khỏi phải thoát khỏi parens và ống dẫn trong regex của bạn.
-E
tùy chọn yêu find
cầu sử dụng "biểu thức chính quy mở rộng". Một số công cụ khác có tùy chọn tương tự, nhưng tôi không chắc tùy chọn này có sẵn trên tất cả các bản phân phối UNIX.
find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)"
.
find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log
. Sử dụng -iregex
cờ cho find
phù hợp với trường hợp không nhạy cảm.
find /path/to/ -type f -print0 | xargs -0 file | grep -i image
Điều này sử dụng file
lệnh để cố gắng nhận ra loại tệp, bất kể tên tệp (hoặc phần mở rộng).
Nếu /path/to
hoặc một tên tệp chứa chuỗi image
, thì ở trên có thể trả về các lần truy cập không có thật. Trong trường hợp đó, tôi đề nghị
cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
-iname *.jpg
, -o -name *.jpeg
, -o -iname *gif
Tất cả đều có một định dạng hơi khác nhau.
trong trường hợp tập tin không có phần mở rộng, chúng tôi có thể tìm loại tập tin mime
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'
trong đó (audio | video | matroska | mpeg) là loại mime regex
& nếu bạn muốn xóa chúng:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
hoặc xóa mọi thứ khác trừ những phần mở rộng đó:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
chú ý! ~ thay vì ~