Secara rekursif menghapus file yang ukurannya kurang dari 1MB


Jawaban:


21

Ini dapat dilakukan dengan find:

find . -type f -size -1M -exec rm {} +

Perhatikan bahwa ini akan secara rekursif turun ke subdirektori, dan tanpa syarat akan menghapus semua file yang lebih kecil dari 1 megabyte. Hati-hati.


Anda melewatkan argumen path tofind

@Useless: Itu GNU find. :)
— Sven Marnach

2
@DanielAndersson: findmembatasi jumlah argumen untuk proses yang dipanggil agar sesuai dengan batas-batas sistem, berbeda dengan rm *, yang dijamin menjadi pemanggilan proses tunggal. findakan memanggil beberapa instance rmjika perlu. Dan saya cukup yakin bahwa karakter khusus diperlakukan dengan benar, termasuk karakter baris baru. Saya lebih suka -exec rmlebih -deletekarena alasan fleksibilitas - sebagai contoh, penawaran terakhir ada cara untuk menghapus write-file yang dilindungi.
— Sven Marnach

1
@Invoker: Saya mengembalikan perubahan Anda karena itu salah. -1Mberarti kurang dari satu megabyte yang diinginkan. Versi Anda akan menghapus semua file dengan ukuran tepat satu megabyte, yang tampaknya merupakan operasi yang tidak berguna.
— Sven Marnach

2
Bagi siapa pun yang tertarik, jika Anda ingin menghapus semua file lebih besar dari 1M, gunakan perintah find . -type f -size +1M -exec rm {} +. Perhatikan +1M bukan -1M.
— chessofnerd

10

Ini harus melakukan pekerjaan:

$ find <directory> -type f -size -1M -delete

Saya tidak berpikir kita perlu tanda hubung dari dari 1M.
— Invoker

2
@ Invoker, saya percaya -tandanya adalah tanda minus yang berarti "kurang dari 1 juta". Jika Anda menjalankan, find <directory> -type f -size +1M -deleteAnda akan menghapus semua file yang lebih besar dari 1M.
— chessofnerd

ya kamu benar
— salahku

2

Hanya untuk variasi dan kemungkinan peningkatan kinerja (mungkin marginal):

find <directory> -type f -size -1M -print0  | xargs -0 rm

Bagaimana ini seharusnya lebih cepat? Ini memulai xargsproses tambahan .
— Sven Marnach

Sekarang Anda dapat memiliki dua CPU yang bersaing untuk perangkat blok yang sama! Lebih masuk akal, operasi stat / readdir tidak diblokir secara sinkron oleh operasi pembatalan tautan. Apakah ini cenderung lebih baik jelas tergantung pada ukuran subtree, jumlah file, perangkat dll.

1

Mencoba

Temukan . -ukuran -1M -exec rm {} \;


1
Ini bagus untuk pengguna non-GNU. Terima kasih! sama dengan jawaban @ Sven, tetapi dengan \;di akhir alih-alih+
— hamx0r

-1

Anda dapat checkout tautan ini http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ , ia memiliki apa yang Anda inginkan.

for file in *;
  do
    file_size=$(du $file | awk '{print $1}');
    if [ $file_size == 0 ]; then
        echo "Deleting empty file $file with file size $file_size!";
        echo "rm -f $file";
    fi;
done

Anda dapat mengulangi semua file dengan for for dan kemudian gunakan du dan awk untuk menemukan ukuran file seperti pada contoh di atas.


Jawaban pada SO harus lengkap - jangan memposting tautan belaka. (Selain itu, kode dalam posting yang ditautkan menghapus file kosong daripada file yang lebih kecil dari 1M.)
— Sven Marnach

@SvenMarnach tidak bisakah kita menggunakan $ file_size <1M dalam tautan contoh kode yang diberikan.

Tidak, kami tidak bisa, karena shell tidak akan mengerti 1M.
— Sven Marnach

Dengan 1M saya maksudkan 1048576 mengkonversi 1MB ke byte

1
Nah, jika Anda menguji apakah ini benar-benar berfungsi dan menyalin kode ke jawaban Anda, ini mungkin menjadi jawaban SO.
— Sven Marnach
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.