Tôi cần phải tìm (hay cụ thể hơn, đếm) tất cả các file phù hợp với mô hình này:.đệ quy tìm tất cả các file phù hợp với một khuôn mẫu nhất định
*/foo/* doc
Trường hợp dấu ký tự đại diện đầu tiên bao gồm một số lượng các thư mục con khác nhau.
Tôi cần phải tìm (hay cụ thể hơn, đếm) tất cả các file phù hợp với mô hình này:.đệ quy tìm tất cả các file phù hợp với một khuôn mẫu nhất định
*/foo/* doc
Trường hợp dấu ký tự đại diện đầu tiên bao gồm một số lượng các thư mục con khác nhau.
Với gnu tìm thấy bạn có thể sử dụng regex, mà (không giống như -name
) phù hợp với toàn bộ đường dẫn:
find . -regex '.*/foo/[^/]*.doc'
Để chỉ đếm số lượng các tập tin:
find . -regex '.*/foo/[^/]*.doc' -printf '%i\n' | wc -l
(Mã nguyên nhân dạng %i
find
để in số inode thay vì tên tệp, không giống như tên tệp, số inode được đảm bảo không có các ký tự như dòng mới, vì vậy việc đếm là đáng tin cậy hơn nhờ @tripleee cho đề xuất.)
Tôi không biết điều đó có hoạt động trên OSX hay không.
Nối "| wc -l" vào cuối phần này và nó hoàn hảo. – pw222
thế nào về:
find BASE_OF_SEARCH/*/foo -name \*.doc -type f | wc -l
Điều này được thực hiện:
Lợi ích của phương pháp này:
CẬP NHẬT: bạn muốn có độ sâu khác nhau không? ok:
find BASE_OF_SEARCH -name \*.doc -type f | grep foo | wc -l
Tùy chọn, bạn có thể lọc ra các kết quả có "foo" trong tệp tên, bởi vì điều này sẽ hiển thị những người quá.
Tác phẩm này hoạt động ngoại trừ việc nó không hoạt động với độ sâu thư mục con biến đổi giữa BASE_OF_SEARCH và foo. Có lẽ tôi không đủ rõ ràng với đặc tả đó. Đó là đủ gần, mặc dù tôi đã có thể hoàn thành nhiệm vụ tôi đặt ra để làm, do đó, một upvote và cảm ơn bạn. – pw222
Bạn nên nhấn mạnh rằng nó không phải đệ quy. Tuy nhiên, điều này thường không cần thiết. Sau đó, nó là một simpe và giải pháp tốt đẹp. Mặc dù nó có thể có vấn đề hiệu suất - không biết. – robsch
Tôi đã thêm một tính năng cho các yêu cầu của bạn – MonkeyWidget
chưa được kiểm tra, nhưng thử:
find . -type d -name foo -print | while read d; do echo "$d/*.doc" ; done | wc -l
tìm thấy tất cả các "foo" thư mục (ở độ sâu khác nhau) (điều này bỏ qua liên kết tượng trưng, nếu đó là một phần của vấn đề bạn có thể thêm chúng); sử dụng vỏ hình cầu để tìm tất cả các tệp ".doc", sau đó đếm chúng.
Vòng lặp 'while' là hoàn toàn dư thừa và có phần dễ bị lỗi. Ngoài ra, ký tự đại diện sẽ không được mở rộng vì nó được trích dẫn. Chỉ cần pipe 'find -print' thành' wc -l'. Tuy nhiên, điều này sẽ vẫn cung cấp cho số lượng sai nếu một tên tập tin có chứa một dòng mới. – tripleee
Nó có bị bash không? zsh có thể làm điều này bằng cách sử dụng cú pháp 'ls **/foo/*. doc'. – Alastair
Alastair, cảm ơn đề nghị. Tôi đã không nhận thức được zsh và cú pháp dấu hoa thị kép của nó. Thật thú vị, nó xuất hiện danh sách đối số mở rộng kết quả là quá dài cho ls (khoảng 6000 tên tập tin) và đưa ra một lỗi. – pw222
Bash v4 cũng hỗ trợ cụm từ đệ quy '**'. – tripleee