Usuń pliki o określonym zakresie wielkości


12

Chcę usunąć pliki, których rozmiar zawiera się między pewnymi wartościami. Na przykład mam następującą listę plików:

-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

Z powyższej listy chcę usunąć tylko pliki, których rozmiar waha się między 386b a 390b . Wiem, że mogę użyć następującego polecenia, aby usunąć pliki, których rozmiar przekracza pewną wartość <size>:

find . -size +<size>-delete

Ale jak mogę dodać jeszcze jedną granicę dla plików, których rozmiar jest mniejszy niż podana wartość?


4
findwarunki są logicznie ORAZ domyślnie, więc po prostu -sizewybierz inną opcję dla drugiej granicy.
jw013

@ jw013 Świetnie! To działa dla mnie. Dzięki! Prześlij go jako odpowiedź, a ja go zaakceptuję.
Eugene S

Odpowiedzi:


7

Zakres jest po prostu górną granicą ORAZ dolną granicą. Ze findspecyfikacji :

wyrażenie [-a] wyrażenie

Koniunkcja pierwotnych; operator AND jest implikowany przez zestawienie dwóch liczb podstawowych lub jawnie przez opcjonalny operator -a. Drugie wyrażenie nie będzie oceniane, jeśli pierwsze wyrażenie jest fałszywe.

Wszystko, co musisz zrobić, to określić obie granice wielkości przed -deleteakcją.


8

-aW wyraźnej ANDoperatora, który pozwala łączyć dwa prawyborach. W takim przypadku utworzenie zakresu za pomocą -size.

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

Zauważ, że rozmiar jest argumentem liczbowym, który można opcjonalnie poprzedzić przy pomocy +i -. Od man 1 find:

   Numeric arguments can be specified as

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

Dziękuję za Twoją odpowiedź. Jednak, jak wspomniano w jego komentarzu @ jw013, findwarunki są logicznie ORAZ domyślnie. Właśnie dodałem jeszcze jeden sizewarunek i działało dobrze! Ostateczne polecenie wygląda następująco:find . -maxdepth 1 -size +358c -size -395c -delete
Eugene S

7

Ilekroć findoczekuje liczby, możesz umieścić +przed nią znak oznaczający więcej niż ten numer lub -znak oznaczający mniej niż ten numer. Są to ścisłe nierówności: +3i -7oznaczają 4, 5 lub 6.

W przypadku -sizepodstawowego należy dodać przyrostek cwskazujący, że liczba jest liczbą bajtów. Możesz łączyć wiele obiektów podstawowych, aby połączyć je (w niektórych wersjach możesz umieścić -alub -andmiędzy nimi). A zatem:

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

W Zsh możesz użyć L kwalifikatora glob . Domyślną jednostką są bajty; jak findpostacie +i -wskazują na ścisłe nierówności.

rm *(L+385-391)

(Powyższe polecenie nie powtarza się w podkatalogach; jeśli potrzebujesz, dodaj **/przed wzorcem).


Nie rozumiem +3 i -7 równych 4, 5 lub 6. Czy możesz to wyjaśnić?
Hashim

1

Jeden sposób przy użyciu perl:

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

Dziękuję za Twoją odpowiedź! Czy tę część kodu należy wprowadzić jako pojedynczy wiersz?
Eugene S

@EugeneS: Tak. Powinno działać wklejenie go w wierszu polecenia bez zmian lub połączenie wszystkich wierszy w jedną.
Birei
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.