Supprimer des fichiers d'une certaine plage de taille


12

Je souhaite supprimer les fichiers dont la taille est comprise entre certaines valeurs. Par exemple, j'ai la liste de fichiers suivante:

-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

Dans la liste ci-dessus, je souhaite supprimer uniquement les fichiers dont la taille varie entre 386b et 390b . Je sais que je peux utiliser la commande suivante pour supprimer des fichiers dont la taille dépasse certains <size>:

find . -size +<size>-delete

Mais comment puis-je ajouter une limite de plus pour les fichiers dont la taille est inférieure à une valeur donnée?


4
findles conditions sont logiquement ET par défaut, il suffit donc de virer de bord sur une autre -sizeoption pour l'autre borne.
jw013

@ jw013 Super! Ça marche pour moi. Merci! Veuillez la poster comme réponse et je l'accepterai.
Eugene S

Réponses:


7

Une plage est simplement une limite supérieure ET une limite inférieure. De la findspécification :

expression [-a] expression

Conjonction des primaires; l'opérateur AND est impliqué par la juxtaposition de deux primaires ou rendu explicite par l'opérateur -a optionnel. La deuxième expression ne doit pas être évaluée si la première expression est fausse.

Il vous suffit donc de spécifier les deux limites de taille avant l' -deleteaction.


8

Le -adans un ANDopérateur explicite qui vous permet de joindre deux primaires. Dans ce cas, créer une plage à l'aide de -size.

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

Notez que la taille est un argument numérique qui peut éventuellement être ajouté avec +et -. De man 1 find:

   Numeric arguments can be specified as

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

Merci pour votre réponse. Cependant, comme @ jw013 l'a mentionné dans son commentaire, les findconditions sont logiquement ET par défaut. J'ai donc ajouté une sizecondition supplémentaire et cela a bien fonctionné! La commande finale ressemble à:find . -maxdepth 1 -size +358c -size -395c -delete
Eugene S

7

Chaque fois findque vous attendez un nombre, vous pouvez mettre un +signe devant lui pour signifier plus que ce nombre, ou un -signe pour signifier moins que ce nombre. Ce sont des inégalités strictes: +3et -7signifie 4, 5 ou 6.

Avec le -sizeprimaire, vous devez ajouter le suffixe cpour indiquer que le nombre est un nombre d'octets. Vous pouvez concaténer plusieurs primaires pour prendre leur conjonction (dans certaines versions, vous pouvez les mettre -aou -andentre elles). Donc:

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

Dans zsh, vous pouvez utiliser le L qualificatif glob . L'unité par défaut est l'octet; comme find, les caractères +et -indiquent des inégalités strictes.

rm *(L+385-391)

(La commande ci-dessus n'est pas récursive dans les sous-répertoires; si vous en avez besoin, ajoutez **/avant le modèle.)


Je ne comprends pas les +3 et -7 égaux à 4, 5 ou 6. Pourriez-vous expliquer?
Hashim

1

À sens unique en utilisant perl:

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

Merci pour votre réponse! Cette partie du code doit-elle être entrée sur une seule ligne?
Eugene S

@EugeneS: Oui. Cela devrait fonctionner en le collant dans votre ligne de commande tel quel ou en joignant toutes les lignes en une seule.
Birei
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.