Tìm tất cả các tệp không byte trong thư mục và thư mục con


82

Làm cách nào tôi có thể tìm thấy tất cả các tệp không byte trong một thư mục và các thư mục con của nó?

Tôi đã làm điều này:

#!/bin/bash
lns=`vdir -R *.* $dir| awk '{print $8"\t"$5}'`
temp=""
for file in $lns; do
    if test $file = "0"; then
        printf $temp"\t"$file"\n"
    fi
    temp=$file
done

Tuy nhiên, tôi chỉ nhận được kết quả trong thư mục hiện tại, không phải thứ tự con và nếu bất kỳ tên tệp nào chứa khoảng trắng thì tôi chỉ nhận được từ đầu tiên theo sau là tab


1
Bạn có thể thích đọc man find.
alk

1
Câu hỏi cũng được đăng trên unix & linux - vui lòng không đăng cùng một câu hỏi ở nhiều nơi.
glenn jackman.

lần sau im không repeate như thế này do vấn đề trong trình duyệt của tôi với stackoverflow i posted in superuser nhưng bây giờ vấn đề cố định bằng cách thanh toán bù trừ các tập tin cookie và lịch sử catche trong ví dụ vì vậy tôi hỏi lại đây
Civa

Câu trả lời:


174

Để in tên của tất cả các tệp trong và dưới $ dir có kích thước 0:

find "$dir" -size 0

Lưu ý rằng không phải tất cả các triển khai của findsẽ tạo ra đầu ra theo mặc định, vì vậy bạn có thể cần phải làm:

find "$dir" -size 0 -print

Hai nhận xét về vòng lặp cuối cùng trong câu hỏi:

Thay vì lặp lại mọi từ khác trong một chuỗi và xem các giá trị thay thế có bằng 0 hay không, bạn có thể loại bỏ một phần vấn đề bạn đang gặp phải với khoảng trắng bằng cách lặp qua các dòng. ví dụ:

printf '1 f1\n0 f 2\n10 f3\n' | while read size path; do
    test "$size" -eq 0 && echo "$path"; done

Lưu ý rằng điều này sẽ không thành công trong trường hợp của bạn nếu bất kỳ đường dẫn nào xuất ra bởi ls chứa các dòng mới và điều này củng cố 2 điểm: không phân tích cú pháp lsvà có chính sách đặt tên lành mạnh không cho phép khoảng trắng trong các đường dẫn.

Thứ hai, để xuất dữ liệu từ vòng lặp, không cần phải lưu trữ đầu ra trong một biến chỉ cho echonó. Nếu bạn chỉ để cho vòng lặp ghi đầu ra của nó vào stdout, bạn sẽ thực hiện điều tương tự nhưng tránh lưu trữ nó.


tôi có thể lọc một thư mục khác với * .xml
Civa

2
Ngoài ra còn có một -emptytùy chọn tiện lợi .
Wesley Baugh

@WesleyBaugh với tùy chọn -empty bạn cũng nhận được các thư mục với tập tin bên trong zero
Igor Scabini

1
@IgorScabini Nếu bạn muốn giới hạn tệp, bạn có thể làm như vậy với -type f.
Wesley Baugh

Đáng yêu! Ngắn gọn và đúng trọng tâm. Trời đất, tôi dùng findlệnh này không đủ. Tôi thực sự phải vượt qua nỗi sợ hãi của mình để tìm ra nó. Rất hữu ích.
racl101 21/12/17

32

Ngoài các câu trả lời ở trên:

Nếu bạn muốn xóa các tệp đó

find $dir -size 0 -type f -delete

1
không cần thiết phải xóa tất cả các tệp có kích thước 0 mọi lúc.
Raghvendra

sau đó làm thế nào để xóa một tập tin trong một thư mục với kích thước 0
Raghvendra

-exec /bin/rm {} \;hoặc -exec /bin/rm {} +cũng sẽ hoạt động trên các findtriển khai không phải GNU , không hỗ trợ tiện ích mở rộng không chuẩn-delete
Gert van den Berg

8

Không, bạn không cần phải bận tâm đến grep.

find $dir -size 0 ! -name "*.xml"

3

Đã thử nghiệm Bash 4+ - Đây là cách chính xác để tìm kiếm kích thước 0:

find /path/to/dir -size 0 -type f -name "*.xml"

Tìm kiếm nhiều phần mở rộng tệp có kích thước 0:

find /path/to/dir -size 0 -type f \( -iname \*.css -o -iname \*.js \)

Lưu ý: Nếu bạn xóa \ (... \), kết quả sẽ là tất cả các tệp đáp ứng yêu cầu này do đó bỏ qua kích thước 0.


-inamekhông thể di chuyển đối với một số triển khai không phải GNU của findXem tại đây để biết danh sách các tùy chọn tiêu chuẩn
Gert van den Berg
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.