J'ai un répertoire contenant quelques centaines de milliers de fichiers.
Je veux supprimer tous les fichiers, mais les rapports rm * -f: "liste d'arguments trop longue"
Quelle est la meilleure façon d'effacer ce répertoire?
J'ai un répertoire contenant quelques centaines de milliers de fichiers.
Je veux supprimer tous les fichiers, mais les rapports rm * -f: "liste d'arguments trop longue"
Quelle est la meilleure façon d'effacer ce répertoire?
Réponses:
Si vous ne pouvez pas supprimer le répertoire, vous pouvez toujours utiliser find.
find . -maxdepth 1 -type f -exec rm -f {} \;
Cela supprimera tous les fichiers du répertoire actuel, et uniquement le répertoire actuel (pas les sous-répertoires).
find dir/to/delete -delete
(ne génère pas de rm
processus par fichier à supprimer).
find dir/to/delete -type f -delete
trouver . -maxdepth 1 -type f -exec rm -f {} \;
cela prend simplement trop de temps (un exec de rm par fichier).
celui-ci est beaucoup plus efficace:
trouver . -maxdepth 1 -type f -print0 | xargs -r0 rm -f
car il faut autant de noms de fichiers que d'arguments pour rm autant que possible, puis exécute rm avec la prochaine charge de noms de fichiers ... il peut arriver que rm ne soit appelé que 2 ou 3 fois.
ionice
juste avant rm
est une bonne idée si l'ordinateur est utilisé par d'autres personnes en même temps.
Ces deux solutions permettront de contourner le problème. Il y a une analyse des performances respectives de chaque technique ici .
find . -name WHATEVER -exec rm -rf {} \;
ou
ls WHATEVER | xargs rm -rf
Le problème provient de l'expansion de bash "*" avec chaque élément unique dans le répertoire. Ces deux solutions fonctionnent à la place dans chaque fichier.
find . -print0 | xargs -0 rm
).
ls *
", et le " *
" se développe dans la liste d'arguments que votre shell se plaint d'être trop long. Faites " ls .
" à la place (ou montez d'un niveau de répertoire et faites " ls [dirname]
").
J'ai pu le faire en sauvegardant un niveau:
cd ..
Et en cours d'exécution:
rm directory name -rf
Et puis recréer le répertoire.
Toutes ces invocations de recherche sont très agréables mais je me souviens rarement exactement de la nomenclature nécessaire lorsque je suis pressé: j'utilise plutôt ls. Comme quelqu'un le mentionne, ls. fonctionnerait mais je préfère ls -1 comme dans:
ls -1 | xargs -n 100 rm -rf
Le chiffre -n xxx est assez sûr pour jouer car le dépassement du maximum sera soit auto-corrigé (si la taille-max est dépassée; voir -s) ou si l'args-max pour une application est dépassé, il sera généralement plutôt évident.
Il convient de noter que grep est pratique à insérer au milieu de cette chaîne lorsque vous souhaitez uniquement supprimer un sous-ensemble de fichiers dans un grand répertoire et que vous ne souhaitez pas utiliser find pour une raison quelconque.
Cette réponse suppose que vous utilisez les utilitaires de base Gnu pour vos ls, xargs, etc.
Voici une version pour supprimer un grand nombre de fichiers lorsque le système doit rester réactif.
Il fonctionne en émettant le travail en petits lots (100 fichiers par défaut) et en attendant un peu que les autres travaux se terminent.
A parfaitement fonctionné pour supprimer plus d'un demi-million de fichiers d'un seul répertoire sur ext3. Il imprime le pourcentage effectué comme un petit bonus
noOfFiles=`ls -U | wc -l`
n=0
while (ls -U | tail -n 100 | xargs rm -f); do
n=$((n+100));
sync;
echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r";
sleep 5;
done
Résout les erreurs «argument trop long» ou «impossible d'allouer de la mémoire»
Cela a fait l'affaire sur plus de 220 000 fichiers dans le dossier de session ....
Avantage: commence à supprimer instantanément les fichiers
chemin cd / vers / dossier
ls -f | xargs rm -f -v
CLIQUEZ pour une capture d'écran des fichiers supprimés - (supprimé tous les fichiers en ~ 15min)
-f (après ls) empêche le tri préalable
-v (après rm) affiche chaque fichier comme étant supprimé
-f (après rm) passe sans aucune invite sur les fichiers protégés en écriture
Conseil: Renommez d'abord le dossier (ex session en session_old) pour empêcher l'ajout de fichiers générés automatiquement pendant que vous essayez de supprimer des fichiers. Vous pouvez refaire manuellement le répertoire d'origine s'il ne le fait pas automatiquement comme dans mon cas