Nous avons un problème avec un dossier qui devient lourd avec des centaines de milliers de fichiers minuscules.
Il y a tellement de fichiers que l'exécution rm -rf
renvoie une erreur et nous devons plutôt procéder de la manière suivante:
find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;
Cela fonctionne mais est très lent et échoue constamment de manquer de mémoire.
Y a-t-il une meilleure manière de faire cela? Idéalement, je voudrais supprimer tout le répertoire sans me soucier de son contenu.
linux
command-line
files
rm
Toby
la source
la source
rm -rf *
dans le dossier échoue probablement à cause d'un trop grand nombre d'arguments; mais qu'en est-ilrm -rf folder/
si vous voulez quand même supprimer tout le répertoire?rm -rf
?fsck
pour récupérer les blocs de disque inutilisés, mais cette approche semble risquée et peut-être pas plus rapide. De plus, la vérification du système de fichiers peut impliquer de toute façon une traversée récursive de l’arborescence du système de fichiers.ccache
arborescence de fichiers était si volumineuse etrm
si longue (et rendant tout le système lent), il était beaucoup plus rapide de copier tous les autres fichiers du système de fichiers, de les formater et de les recopier. Depuis lors, je donne à de tels petits arbres de fichiers leur propre système de fichiers, de sorte que vous pouvezmkfs
directement au lieu derm
.Réponses:
Utiliser rsync est surprenant, rapide et simple.
La réponse de @ sarath mentionnait un autre choix rapide: Perl! Ses repères sont plus rapides que
rsync -a --delete
.Sources:
la source
rsync
peut être plus rapide que clairrm
, car il garantit les suppressions dans le bon ordre, ce qui nécessite moins de recalcul du temps de calcul. Voir cette réponse serverfault.com/a/328305/105902-P
option à rsync pour un peu plus d’affichage, faites attention à la syntaxe, les barres obliques de fin sont obligatoires. Enfin, vous pouvez lancer la commande rsync une première fois avec l’-n
option de lancer un essai à blanc en premier .-a
égal-rlptgoD
, mais pour la suppression seulement-rd
est nécessaireQuelqu'un sur Twitter a suggéré d'utiliser
-delete
au lieu de-exec rm -f{} \;
Cela a amélioré l'efficacité de la commande, il utilise toujours la récursivité pour tout parcourir.
la source
find
a-delete
, et d'autresfind
peut-être.-delete
doit toujours être préféré-exec rm
lorsque disponible, pour des raisons de sécurité et d’efficacité.Qu'en est-il quelque chose comme:
find /path/to/folder -name "filenamestart*" -type f -print0 | xargs -0rn 20 rm -f
Vous pouvez limiter le nombre de fichiers à supprimer en une fois en modifiant l’argument du paramètre
-n
. Les noms de fichiers avec des blancs sont également inclus.la source
-n 20
bit, car xargs devrait de toute façon se limiter à des tailles de liste d'arguments acceptables.man xargs
:(...) max-chars characters per command line (...). The largest allowed value is system-dependent, and is calculated as the argument length limit for exec
. Donc, l'-n
option est destinée aux cas où xargs ne peut pas déterminer la taille de la mémoire tampon de la CLI ou si la commande exécutée a des limites.Pour en revenir à l’un des commentaires, je ne pense pas que vous faites ce que vous pensez faire.
J'ai d'abord créé une énorme quantité de fichiers, pour simuler votre situation:
Ensuite, j'ai essayé ce que je m'attendais à échouer et ce que vous faites apparemment à la question:
Mais cela ne le travail:
la source
rm -Rf bigdirectory
plusieurs fois. J'ai eu un répertoire avec des millions de millions de sous-répertoires et de fichiers. Je ne pouvais même pas courirls
oufind
oursync
dans ce répertoire, car il a manqué de mémoire. La commanderm -Rf
quitte plusieurs fois (mémoire insuffisante) en ne supprimant qu'une partie des milliards de fichiers. Mais après plusieurs tentatives, il a finalement fait le travail. Semble être la seule solution si le manque de mémoire est le problème.Un truc astucieux:
Cela nécessite beaucoup de ressources processeur, mais vraiment très rapide. Voir https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html
la source
rsync -a --delete
vs 43 pourlsdent
. Le rapport 10x était pourtime ls -1 | wc -l
vstime ./dentls bigfolder >out.txt
(c'est une comparaison partiellement juste en raison de> file
vswc -l
).J'ai eu l'occasion de tester
-delete
par rapport à-exec rm \{\} \;
et pour moi-delete
était la réponse à ce problème.En utilisant
-delete
supprimé les fichiers dans un dossier de 400 000 fichiers au moins 1 000 fois plus rapide querm
.L'article 'Comment supprimer un grand nombre de fichiers sous Linux' suggère qu'il est environ trois fois plus rapide, mais dans mon test, la différence était beaucoup plus spectaculaire.
la source
find -exec
exécute larm
commande pour chaque fichier séparément, c'est pourquoi il est si lent.A propos de l'
-delete
option ci-dessus: je l'utilise pour supprimer un grand nombre de fichiers (1M + est) dans un dossier temporaire que j'ai créé et que j'ai oublié par inadvertance de nettoyer tous les soirs. J'ai accidentellement rempli mon disque / partition, et rien d'autre ne pouvait les supprimer sauf lafind .
commande. C'est lent, au début j'utilisais:Mais cela prenait un temps EXTREME. Cela a commencé après environ 15 minutes pour supprimer certains fichiers, mais j’imagine qu’il en supprimait moins de 10 par seconde environ après le début. Alors, j'ai essayé le:
au lieu de cela, et je le laisse courir maintenant. Il semble fonctionner plus vite, bien que cela pèse EXTRÊMEMENT sur le CPU, contrairement à l’autre commande. Cela fait environ une heure que ça fonctionne et je pense que je vais gagner de la place sur mon disque et que la partition se "maigrit" progressivement, mais cela prend encore beaucoup de temps. Je doute sérieusement que cela fonctionne 1 000 fois plus vite que l'autre. Comme dans toutes choses, je voulais juste souligner le compromis entre l'espace et le temps. Si vous avez la bande passante du processeur à dépenser (nous le faisons), exécutez cette dernière. Il y a mon processeur en marche (
uptime
rapports):Et j’ai vu la charge moyenne dépasser 30,00, ce qui n’est pas bon pour un système occupé, mais pour le nôtre, qui est normalement peu chargé, la situation est acceptable pendant quelques heures. J'ai vérifié la plupart des autres éléments du système et ils sont toujours réactifs, donc tout va bien pour le moment.
la source
exec
vous ne voudrez presque certainement pas utiliser-ls
et dofind . -type f -exec rm '{}' +
+ est plus rapide car il donnera à rm autant d'arguments qu'il peut gérer à la fois.find … -delete
parnice
ouionice
, qui peut aider. Il est donc possible que certaines options de montage soient remplacées par des paramètres moins protégés contre les collisions. (Et, bien sûr, en fonction des élémentsmkfs
1
pour une machine monocœur est identique à loadavg64
sur un système 64 cœurs, ce qui signifie que chaque processeur est occupé à 100% du temps.Il existe plusieurs méthodes qui peuvent être utilisées pour supprimer un grand nombre de fichiers sous Linux. Vous pouvez utiliser l’option find with delete, qui est plus rapide que l’option exec. Ensuite, vous pouvez utiliser Perl unlink, puis même rsync. Comment supprimer un grand nombre de fichiers sous Linux
la source
Pensez à utiliser le volume Btrfs et supprimez simplement le volume entier pour un tel répertoire avec un grand nombre de fichiers.
Sinon, vous pouvez créer un fichier image FS, puis démonter et supprimer son fichier pour tout supprimer en même temps très rapidement.
la source
En supposant que GNU soit
parallel
installé, j'ai utilisé ceci:parallel rm -rf dir/{} ::: `ls -f dir/`
et c'était assez rapide.
la source
Utilisez
rm -rf directory
au lieu derm -rf *
.Au début, nous étions
rm -rf *
dans le répertoire pour effacer le contenu et nous avons pensé que c'était aussi rapide que possible. Mais l'un de nos ingénieurs expérimentés nous a suggéré d'éviter d'utiliser les astérisques (*
) et de passer plutôt dans le répertoire parent, commerm -rf directory
.Après de vives discussions sur la manière dont cela ne ferait pas une différence, nous avons décidé de le comparer, avec une troisième méthode d'utilisation
find
. Voici les résultats:rm -rf directory
est environ 9 fois plus rapide querm -rf *
!Inutile de dire que nous avons acheté une bière à cet ingénieur !
Nous utilisons donc maintenant
rm -rf directory; mkdir directory
pour supprimer le répertoire et le recréer.la source
La suppression des VRAI GRANDS répertoires nécessite une approche différente, comme je l’ai appris sur ce site - vous devrez utiliser ionice.Il garantit (avec -c3) que les suppressions ne seront effectuées que lorsque le système dispose d’un délai d’entrée-sortie. La charge de vos systèmes ne sera pas élevée et tout restera réactif (bien que mon temps de calcul pour trouver était assez élevé, à environ 50%).
la source
+
au lieu de\;
rendrait cela plus rapide car il transmet plus d'arguments à la fois, moins de forkingionice -c3 find <dir> -type f -delete
Si vous avez des millions de fichiers et que chacune des solutions ci-dessus crée un stress dans votre système, essayez cette inspiration:
Fichier
nice_delete
:Et maintenant, supprimez les fichiers:
Find créera des lots (voir
getconf ARG_MAX
) de quelques dizaines de milliers de fichiers et les transmettra ànice_delete
. Cela créera des lots encore plus petits pour permettre de dormir lorsque la surcharge est détectée.la source
devrait fonctionner dans le dossier principal
la source
ls
ne fonctionnera pas à cause de la quantité de fichiers dans le dossier. C'est pourquoi j'ai dû utiliserfind
, merci quand même.ls -f
, ce qui désactive le tri. Le tri nécessite que le répertoire entier soit chargé en mémoire pour être trié. Un non triéls
devrait pouvoir diffuser sa sortie.find . -print0 | xargs -0 rm
, qui utilisera le caractère NULL comme séparateur de nom de fichier.Pour l'indice d'Izkata ci-dessus:
Cela a presque fonctionné - ou aurait fonctionné - mais j'ai eu quelques problèmes d'autorisation. Les fichiers étaient sur un serveur, mais je ne comprends toujours pas d'où vient ce problème de permission. Quoi qu'il en soit, le terminal a demandé une confirmation pour chaque fichier. Le nombre de fichiers était d’environ 20 000, ce n’était donc pas une option. Après "-r", j'ai ajouté l'option "-f". La commande entière était donc " rm -r -f nomdossier / ". Ensuite, cela a semblé bien fonctionner. Je suis un novice avec Terminal, mais je suppose que c'était d'accord, non? Merci!
la source
En fonction de votre capacité à vous débarrasser de ces fichiers, je vous suggère d'utiliser
shred
.si vous voulez purger le répertoire, mais que vous ne pouvez pas le supprimer et le recréer, je suggère de le déplacer et de le recréer instantanément.
croyez-le ou non, ceci est plus rapide, car un seul inode doit être changé. Rappelez-vous: vous ne pouvez pas vraiment paralléliser ce goût sur un ordinateur multicœur. Cela se résume à l'accès au disque, qui est limité par le RAID ou ce que vous avez.
la source
shred
ne fonctionnera pas avec beaucoup de systèmes de fichiers modernes.Si vous souhaitez simplement vous débarrasser de nombreux fichiers dès que possible,
ls -f1 /path/to/folder/with/many/files/ | xargs rm
cela fonctionnera sans problème, mais ne le lancez pas sur des systèmes de production, car votre système risque de devenir un problème d'E / S et les applications risquent de rester bloquées lors de l'opération de suppression.Ce script fonctionne bien pour de nombreux fichiers et ne devrait pas affecter le chargement du système.
la source