Bu boyut 1MB'den küçük dosyaları tekrar tekrar kaldırın


Yanıtlar:


21

Bu, aşağıdakilerle yapılabilir find:

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

Bunun özyinelemeli olarak alt dizinlere ineceğini ve 1 megabayttan küçük tüm dosyaları koşulsuz olarak sileceğini unutmayın. Dikkatli ol.


find

@Useless: Bu GNU find. :)
Sven Marnach

2
@DanielAndersson: tek bir işlem çağrısı olduğu garantilenen findaksine, çağrılan süreçle ilgili argüman sayısını sistemin sınırlarına sığacak şekilde kısıtlar rm *. gerekirse findbirden çok örneğini çağırır rm. Ve eminim ki yeni satır karakterleri de dahil olmak üzere özel karakterlere doğru davranılıyor. Tercihim -exec rmüzerinde -deleteesneklik nedenlerle - örnek olarak, ikincisi teklifler hiçbir şekilde silme yazmaya karşı korumalı dosyalara.
Sven Marnach

1
@Invoker: Değişikliğiniz yanlış olduğu için geri döndüm. -1Mistenildiği gibi bir megabayttan daha az anlamına gelir. Sürümünüz, tam olarak bir megabayt boyutundaki tüm dosyaları siler, bu da anlamsız bir işlem gibi görünüyor.
Sven Marnach

2
İlgilenen herkes için, 1M'den büyük tüm dosyaları kaldırmak istiyorsanız , komutu kullanın find . -type f -size +1M -exec rm {} +. -1M yerine + 1M değerine dikkat edin.
chessofnerd

10

Bu işi yapmalıdır:

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

1M'den kısa çizgi çıkarmamız gerektiğini düşünmüyorum.
Invoker

2
@Invoker, -işaretin "1 milyondan az" anlamına gelen eksi işareti olduğuna inanıyorum . Çalıştırırsanız find <directory> -type f -size +1M -delete, 1M'den büyük tüm dosyaları silersiniz .
chessofnerd

evet haklısın haklısın
Invoker

2

Sadece çeşitlilik ve olası (muhtemelen marjinal) bir performans kazancı için:

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

Bunun nasıl daha hızlı olması gerekiyor? Ek bir xargsişlem başlatır .
Sven Marnach

Artık aynı blok cihaz için iki CPU'nuz olabilir ! Daha mantıklı olarak, stat / readdir işlemleri bağlantıyı kaldırma işlemi tarafından senkronize olarak engellenmez. Bunun daha iyi olacağı açık bir şekilde alt ağaç boyutuna, dosya sayısına, cihaz vb. Bağlıdır

1

Deneyin

bulmak. -boyut -1M -exec rm {} \;


1
Bu, GNU üyesi olmayan kullanıcılar için mükemmeldir. Teşekkürler! @ \;+
Sven'in

-1

Bu bağlantıyı kontrol edebilirsiniz http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ , tam olarak ne istediğinizi var.

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

Bir for döngüsü ile tüm dosyaları yineleyebilir ve yukarıdaki örnekte olduğu gibi dosya boyutunu bulmak için du ve awk kullanabilirsiniz.


SO ile ilgili cevaplar kendi içinde olmalıdır - sadece bir bağlantı göndermeyin. (Ayrıca, bağlantılı
gönderideki kod 1M'den

@SvenMarnach, verilen kod örneği bağlantısında $ file_size <1M kullanamıyoruz.

Hayır, yapamayız, çünkü kabuk anlamayacak 1M.
Sven Marnach

1M I 1048576 bayta 1MB dönüştürülmesi anlamına

1
Bunun gerçekten işe yarayıp yaramadığını test ederseniz ve kodu cevabınıza kopyalarsanız, bu bir SO yanıtı olabilir.
Sven Marnach
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.