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.