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.