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.

Sven Marnach
la source
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
jcollado
la source
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
Inutile
la source
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 {} \;

ahvargas
la source
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.

Steen Schütt
la source
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