Komut satırı üzerinden boyutu 0 bayt olan dosyalar kaldırılsın mı?


16

Yani, diğer dizinlerle dolu bir dizin var ve boyutu olmayan dosyaları kaldırmak mümkün olup olmadığını merak ediyordum. Genellikle bu dosyalar 0 bayttır ve tüm bu alt dizinleri birleştirmek istediğimden, mükemmel bir okunaklı dosyayı ağırlıksız bir 0 bayt dosyasıyla değiştirebilirim ve okunaklı dosyama gider. Sıfır bayt dosyalarını kaldırmanın herhangi bir yolu var mı?

Yanıtlar:


34

Dosyaları boyuta göre bulmak ve dosya adlarını standart çıktıya yazdırmak için Bul komutunu kullanın .

find . -type f -size 0b -print

yerine -printsahip -deletedosyaları silmek yerine ekranda yazdırmak için.

find . -type f -size 0b -delete

Şimdi, dosyaları bir konumdan diğerine taşımanın herhangi bir yolu var mı ve boyut aynı ise çakışmalarla değiştiriliyor, ancak boyut farklıysa her iki kopyayı da saklıyor musunuz?
user245115

Bu rsync için bir iş gibi geliyor .

7
Bunun -emptyyerine kullanabilirsiniz -size 0b.
Kevin

6

0 boyutlu tüm dosyaları özyinelemeli olarak bulun ve kaldırın:

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

Misal:

% 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

Doğrudan kabukta da yapabilirsiniz. Boş gizli dosyaları (adı a ile başlayanlar .) silmek istemiyorsanız bu yararlı olabilir . Bunu da yapabilseniz findde, bir alternatif de kabuğun kendisini kullanmak olacaktır:

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

açıklama

  • shopt -s globstar: bash için globstar seçeneğini açarak **bir veya daha fazla alt dizini eşleştirir. **/*geçerli dizindeki tüm dosya ve dizinlerle ve tüm alt dizinleriyle eşleşir.
  • for file in **/*; do ...; done : bulunan tüm dosyalar ve dizinler üzerinde yineleme;
  • [ ! -s "$file" ]: [ -s "$file" ]dosya varsa ve boş değilse doğrudur. Bu nedenle, dosya yoksa veya boşsa [ ! -s "$file" ]( !testi tersine çevirir) doğrudur.
  • [ -f "$file" ]: dosya normal bir dosyaysa true. Dizin, aygıt dosyası veya simge bağlantısı vb. Değil
  • rm "$file" : dosyayı silmenizi sağlar.

Bir &&sonraki komutun yalnızca bir öncekinin başarılı olması durumunda çalıştırıldığından emin olun, böylece bu yalnızca boş, normal dosyaları siler.


ve düşündüm, cevabım karmaşık :) +1
AB

2

Yukarıdaki yanıtların çoğu doğru olsa da, bu komutu arayın:

0 bayt boyutlu bir dosya boş bir dosya anlamına gelir

ancak bu komutu çalıştırabilirsiniz:

find . -type f -empty -delete

bu, tüm boş dosyaları silecektir.

Silmeden önce bu dosyalara göz atabilirsiniz:

find . -type f -empty

Ubuntu 14.04 LTS'de -type f,-empty aynı zamanda boş dizinleri siler. Adam sayfasını kontrol ettim.
Bulrush
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.