2011-04-24 30 views
9

Tôi muốn kết quả tìm đường ống thành một tìm kiếm mới. Những gì tôi có là:Tìm đường ống để tìm

find . -iname "2010-06*" -maxdepth 1 -type d | xargs -0 find '{}' -iname "*.jpg" 

Kết quả mong đợi: Tìm thứ hai nhận danh sách các thư mục chứa trong các thư mục đó.

Kết quả thực tế: "find: ./2010-06 New York \ n: tùy chọn không xác định"

Oh darn. Tôi có một cảm giác nó liên quan đến định dạng của đầu ra mà thứ hai tìm thấy như là đầu vào, nhưng ý tưởng duy nhất của tôi là hậu tố -print0 để tìm thấy đầu tiên, không có thay đổi gì cả.

Bất kỳ ý tưởng nào?

Trả lời

8

Bạn cần 2 điều. -print0 và quan trọng hơn là -I{} trên xargs, nếu không thì {} sẽ không làm gì cả.

find . -iname "2010-06*" -maxdepth 1 -type d -print0 | xargs -0 -I{} find '{}' -iname '*.jpg' 
+0

Tuyệt vời. Điều này hoạt động như mong đợi. –

+1

bạn có chắc là nó hoạt động không? maxdepth phải đến trước khi -iname – ghostdog74

+0

Từ 'man find':" -and được giả định nơi toán tử bị bỏ qua. " Do đó, trật tự không quan trọng vì chúng đều được đánh giá và tất cả đều phải đúng. –

1

Làm thế nào về

find . -iwholename "./2010-06*/*.jpg 

vv?

+0

Bạn phải bao gồm "./" hàng đầu trong giá trị được cung cấp cho tùy chọn. –

+0

Đó là '-iwholename', không phải' -iwholepath' –

+0

Giải pháp thanh lịch hơn, bạn đúng. Mặc dù những gì tôi đã không giải thích kỹ lưỡng là, rằng tôi quan tâm đến việc làm cho đường ống làm việc, và không cụ thể này tìm thấy vấn đề. Cảm ơn mặc dù. :-) –

1

Mặc dù bạn đã nói rằng bạn đặc biệt muốn vấn đề tìm ống + này hoạt động, nhưng không hiệu quả để ngã ba thêm một lệnh find. Vì bạn đang chỉ định -maxdepth là 1, nên bạn không đi qua các thư mục con. Vì vậy, chỉ cần sử dụng một vòng lặp for với mở rộng vỏ.

for file in *2010-06*/*.jpg 
do 
    echo "$file" 
done 

Nếu bạn muốn tìm tất cả các file jpg bên trong mỗi 2010-06 * thư mục đệ quy, đó cũng là không cần phải sử dụng nhiều finds hoặc xargs

for directory in 2010-06*/ 
do 
    find $directory -iname "*.jpg" -type f 
done 

Hoặc chỉ cần

find 2006-06* -type f -iname "*.jpg"

Hoặc thậm chí tốt hơn, nếu bạn có bash 4 trở lên

shopt -s globstar 
shopt -s nullglob 
for file in 2010-06*/**/*.jpg 
do 
    echo "$file" 
done 
+1

Điều này không khớp với chức năng.Các -maxdepth 1 loại bỏ ./abc/2010-06/def/ghi.jpg, nhưng không. 2010-06/def/ghi.jpg. –

+0

Tôi đề nghị bạn làm một bài kiểm tra cho chính mình và tìm hiểu. Xem trang tìm người cho maxdepth là gì. – ghostdog74

+1

Tôi đề nghị bạn thử trường hợp thử nghiệm này: 'mkdir -p 2010-06/def; chạm vào 2010-06/def/ghi.jpg; cho tệp trong * 2010-06 */*. jpg; làm echo "$ file"; done' Đầu ra: 'bash: no match: * 2010-06 */* .jpg' (với cụm cầu vồng của bash không bật) –

6

Sử dụng vô dụng các xarg.

find 2010-06* -iname "*.jpg" 

Ít nhất Gnu-find chấp nhận nhiều đường dẫn để tìm kiếm. -maxdepth và type -d được giả định hoàn toàn.

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