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?

Eugene S
la source
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.

jw013
la source
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.
George M
la source
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.)

Gilles 'SO- arrête d'être méchant'
la source
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 $_: $!] 
        } 
    }
' *
Birei
la source
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