Loại bỏ các tệp có kích thước 0 byte thông qua dòng lệnh?


16

Vì vậy, tôi nhận được một thư mục chứa đầy các thư mục khác và tôi tự hỏi liệu có thể xóa các tệp không có kích thước không. Thông thường các tệp này là 0 byte và vì tôi muốn hợp nhất tất cả các thư mục con này, tôi có thể thay thế một tệp hoàn toàn hợp pháp bằng tệp 0 byte không trọng lượng và có tệp hợp pháp của tôi. Bất kỳ cách nào để loại bỏ các tập tin byte không?

Câu trả lời:


34

Sử dụng lệnh Tìm để tìm tệp theo kích thước và in tên tệp vào đầu ra tiêu chuẩn.

find . -type f -size 0b -print

thay thế -printbằng -deleteđể xóa các tập tin hơn là in chúng trên màn hình.

find . -type f -size 0b -delete

Bây giờ, có cách nào để di chuyển các tệp từ vị trí này sang vị trí khác không và với các xung đột thay thế nếu kích thước giống nhau nhưng giữ cả hai bản sao nếu kích thước khác nhau?
dùng245115

Điều này nghe có vẻ như một công việc cho rsync .

7
Bạn có thể sử dụng -emptythay vì -size 0b.
Kevin

6

Tìm và xóa tất cả các tệp có kích thước 0 đệ quy:

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

Thí dụ:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo

4

Bạn cũng có thể làm điều đó trực tiếp trong vỏ. Điều này có thể hữu ích nếu bạn không muốn xóa các tệp ẩn trống (những tệp có tên bắt đầu bằng a .). Mặc dù bạn cũng có thể làm điều đó find, nhưng một cách khác là sử dụng chính vỏ:

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

Giải trình

  • shopt -s globstar: bật tùy chọn globalstar cho bash, điều này **khớp với một hoặc nhiều thư mục con. **/*sẽ khớp với tất cả các tệp và thư mục trong thư mục hiện tại và tất cả các thư mục con của nó.
  • for file in **/*; do ...; done : lặp đi lặp lại trên tất cả các tập tin và thư mục được tìm thấy;
  • [ ! -s "$file" ]: [ -s "$file" ]là đúng nếu tệp tồn tại và không trống. Do đó, [ ! -s "$file" ]( !đảo ngược kiểm tra) là đúng nếu tệp không tồn tại hoặc nếu nó trống.
  • [ -f "$file" ]: true nếu tệp là tệp thông thường. Không phải là một thư mục hoặc một tập tin thiết bị hoặc một liên kết tượng trưng, ​​vv
  • rm "$file" : xóa tập tin.

Các &&đảm bảo rằng các lệnh tiếp theo là chỉ chạy nếu trước đó đã thành công vì vậy đây sẽ chỉ xóa rỗng, các file thông thường.


và tôi nghĩ, câu trả lời của tôi rất phức tạp :) +1
AB

2

Mặc dù hầu hết câu trả lời ở trên là chính xác, hãy xem lệnh này:

Tệp có kích thước 0 byte có nghĩa là tệp trống

mặc dù bạn có thể chạy lệnh này:

find . -type f -empty -delete

điều này sẽ xóa tất cả các tập tin trống.

Bạn có thể xem các tệp đó trước khi xóa:

find . -type f -empty

Trên Ubuntu 14.04 LTS, không có -type f, -emptycũng sẽ xóa các thư mục trống. Chỉ cần kiểm tra trang người đàn ông.
Bulrush
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.