Supprimer récursivement les fichiers dont la taille est inférieure à 1 Mo


Réponses:


21

Cela peut être fait avec find:

find . -type f -size -1M -exec rm {} +

Notez que cela descendra récursivement dans les sous-répertoires et supprimera inconditionnellement tous les fichiers inférieurs à 1 mégaoctet. Faites attention.


vous manquez l'argument du chemin versfind

@Useless: c'est GNU find. :)
— Sven Marnach

2
@DanielAndersson: findlimite le nombre d'arguments au processus appelé pour tenir dans les limites du système, contrairement à rm *ce qui est garanti comme étant une invocation de processus unique. findinvoquera plusieurs instances de rmsi nécessaire. Et je suis presque sûr que les caractères spéciaux sont traités correctement, y compris les caractères de nouvelle ligne. Je préfère -exec rmplutôt -deletepour des raisons de flexibilité - à titre d'exemple, ce dernier n'offre aucun moyen de supprimer les fichiers protégés en écriture.
— Sven Marnach

1
@Invoker: J'ai annulé votre modification car elle était incorrecte. -1Msignifie moins d'un mégaoctet comme souhaité. Votre version supprimerait tous les fichiers avec exactement un mégaoctet, ce qui semble être une opération quelque peu inutile.
— Sven Marnach

2
Pour toute personne intéressée, si vous souhaitez supprimer tous les fichiers supérieurs à 1 Mo, utilisez la commande find . -type f -size +1M -exec rm {} +. Notez le + 1M au lieu de -1M.
— chessofnerd

10

Cela devrait faire le travail:

$ find <directory> -type f -size -1M -delete

Je ne pense pas que nous ayons besoin de faire un trait d'union à partir de 1M.
— Invocateur du

2
@Invoker, je crois que le -signe est un signe moins signifiant "moins de 1M". Si vous exécutez, find <directory> -type f -size +1M -deletevous supprimerez tous les fichiers supérieurs à 1 Mo.
— chessofnerd

oui tu as raison ma mauvaise
— Invocateur

2

Juste pour la variété et un gain de performance possible (probablement marginal):

find <directory> -type f -size -1M -print0  | xargs -0 rm

Comment est-ce censé être plus rapide? Il démarre un xargsprocessus supplémentaire .
— Sven Marnach

Maintenant, vous pouvez avoir deux processeurs rivalisant pour le même périphérique de bloc! Plus judicieusement, les opérations stat / readdir ne sont pas bloquées de manière synchrone par l'opération de dissociation. La probabilité que cela soit meilleur dépend évidemment de la taille du sous-arbre, du nombre de fichiers, de l'appareil, etc.

1

Essayer

trouver . -size -1M -exec rm {} \;


1
C'est génial pour les utilisateurs non GNU. Merci! identique à la réponse de @ Sven, mais avec \;à la fin au lieu de+
— hamx0r

-1

Vous pouvez consulter ce lien http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ , il a exactement ce que vous voulez.

for file in *;
  do
    file_size=$(du $file | awk '{print $1}');
    if [ $file_size == 0 ]; then
        echo "Deleting empty file $file with file size $file_size!";
        echo "rm -f $file";
    fi;
done

Vous pouvez parcourir tous les fichiers avec une boucle for puis utiliser du et awk pour trouver la taille du fichier comme dans l'exemple ci-dessus.


Les réponses sur SO doivent être autonomes - ne publiez pas un simple lien. (De plus, le code dans le message lié supprime les fichiers vides plutôt que les fichiers inférieurs à 1M.)
— Sven Marnach

@SvenMarnach ne peut-on pas utiliser $ file_size <1M dans le lien d'exemple de code donné.

Non, nous ne pouvons pas, car le shell ne comprendra pas 1M.
— Sven Marnach

Par 1M, je voulais dire 1048576 convertissant 1 Mo en octets

1
Eh bien, si vous testez si cela fonctionne vraiment et copiez le code dans votre réponse, cela pourrait devenir une réponse SO.
— Sven Marnach
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.