Belirli boyut aralığındaki dosyaları silme


12

Boyutu belirli değerler arasında olan dosyaları silmek istiyorum. Örneğin, aşağıdaki dosya listesine sahibim:

-rw-r--r-- 1 smsc sys  558 Apr 30 13:07 stats.sfe.1.20120430130513.xml.Z
-rw-r--r-- 1 smsc sys  388 Apr 30 15:32 stats.sfe.1.20120430153013.xml.Z
-rw-r--r-- 1 smsc sys  386 Apr 30 15:36 stats.sfe.1.20120430153513.xml.Z
-rw-r--r-- 1 smsc sys  389 Apr 30 15:42 stats.sfe.1.20120430154013.xml.Z
-rw-r--r-- 1 smsc sys  390 Apr 30 16:02 stats.sfe.1.20120430160013.xml.Z
-rw-r--r-- 1 smsc sys  385 Apr 30 16:12 stats.sfe.1.20120430161013.xml.Z

Yukarıdaki listeden, yalnızca boyutu 386b ve 390b arasında değişen dosyaları silmek istiyorum . Ben belirli boyutu aşan dosyaları silmek için aşağıdaki komutu kullanabilirsiniz biliyorum <size>:

find . -size +<size>-delete

Ancak boyutu belirli bir değerden küçük dosyalar için nasıl bir sınır daha ekleyebilirim?


4
findkoşullar mantıksal olarak AND'dir ve varsayılan olarak, -sizediğer sınır için başka bir seçeneğe yapışmanız yeterlidir .
jw013

@ jw013 Harika! Bu benim için işe yarıyor. Teşekkürler! Lütfen cevabınız olarak gönderin ve kabul edeceğim.
Eugene S

Yanıtlar:


7

Bir aralık basitçe bir üst sınır ve bir alt sınırdır. Gönderen findspec :

ifade [-a] ifade

Primerlerin birleşimi; AND operatörü, iki primerin yan yana yerleştirilmesiyle ima edilir veya isteğe bağlı -a operatörü tarafından açıkça belirtilir. İlk ifade yanlışsa ikinci ifade değerlendirilmez.

Dolayısıyla, yapmanız gereken tek şey -deleteeylemden önce her iki boyut sınırını belirtmektir .


8

-aAçık bir de ANDiki ön seçim birleştirirsek sağlayan operatör. Bu durumda kullanarak bir aralık oluşturma -size.

find . -size +386b -a -size -390b -exec rm -f {} \;

Boyutun isteğe bağlı olarak +ve ile başlayabileceğiniz sayısal bir bağımsız değişken olduğunu unutmayın -. Gönderen man 1 find:

   Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n      for exactly n.

Cevabınız için teşekkür ederim. Ancak, @ jw013 yorumunda belirtildiği gibi, findkoşullar varsayılan olarak mantıklıdır VE. Bu yüzden sadece bir sizekoşul daha ekledim ve işe yaradı! Son komut şuna benziyor:find . -maxdepth 1 -size +358c -size -395c -delete
Eugene S

7

Her ne zaman findbir numara bekler, bir koyabilirsiniz +daha bu numaradan veya daha anlamında önce işaretini -işareti az bu sayı daha anlamında. Bunlar katı eşitsizliklerdir: +3ve -74, 5 veya 6 anlamına gelir.

İle -sizebirincil, sen son ek eklemeniz gerekir cnumara bayt sayısı olduğunu belirtmek için. Birleşimlerini almak için birden fazla primeri birleştirebilirsiniz (bazı sürümlerde, bunların arasına -aveya -andarasına koyabilirsiniz ). Böylece:

find . -size +385c -size -391c -delete

Zsh'de L glob niteleyicisini kullanabilirsiniz . Varsayılan birim bayttır; gibi findkarakterler +ve -katı eşitsizlikleri gösterir.

rm *(L+385-391)

(Yukarıdaki komut alt dizinlere geri alınmaz; buna ihtiyacınız varsa **/desenden önce ekleyin .)


+3 ve -7 eşittir 4, 5 veya 6'yı anlamıyorum. Açıklayabilir misiniz?
Hashim

1

Kullanmanın tek yolu perl:

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *

Cevabınız için teşekkür ederim! Kodun bu kısmı tek bir satır olarak mı girilmelidir?
Eugene S

@EugeneS: Evet. Komut satırınıza olduğu gibi yapıştırarak veya tüm satırları tek bir satırda birleştirerek çalışmalıdır.
Birei
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.