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.

Sven Marnach
sumber
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
jcollado
sumber
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
Tak berguna
sumber
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 {} \;

ahvargas
sumber
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.

Steen Schütt
sumber
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