J'ai deux répertoires au même niveau et je peux faire:
rm -rf dir1/; rm -rf dir2/
mais ils fonctionneront séquentiellement, comment pourrais-je les supprimer en parallèle? Existe-t-il également une solution générique qui me permet d’étendre à de nombreux dossiers?
Mettre à jour
Les répertoires peuvent être profondément imbriqués, contenant d’autres répertoires, etc.
Exécuter les commandes en arrière-plan
rm -rf dir &; rm -rf dir2 &;
syntaxe
long_command with arguments > redirection &
vous pouvez capturer tous les messages en redirigeant le résultat de la commande vers un fichier.
Ces liens vous aideront ==> http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
Le titre de la question et l'exemple donné donnent une impression comme si le problème était très petit. Mais une prime supplémentaire montrant le sérieux de la question.
Il serait préférable de spécifier la nature de vos fichiers. Cependant, je fournis une suppression basée sur le fractionnement qui peut être implémentée en tant qu'exécutions parallèles. Vous pouvez essayer les options ci-dessous en fonction de vos besoins.
find /yourpath/folder1 -size +1048576 -exec rm -f {} \; &
find /yourpath/folder2 -size +1048576 -exec rm -f {} \; &
ls -l /yourpath/folder1 | awk '{print $9}' | awk -F. '{print $(NF)}' |sort |uniq
vous pouvez obtenir un résultat comme
.txt
.log
.tmp
.Zip
maintenant, supprimez les fichiers en fonction des extensions
find yourpath/folder1 -name '*.txt' -exec rm {} \; &
find yourpath/folder1 -name '*.tmp' -exec rm {} \; &
find yourpath/folder1 -name '*.log' -exec rm {} \; &
find yourpath/folder2 -name '*.txt' -exec rm {} \; &
find yourpath/folder2 -name '*.tmp' -exec rm {} \; &
find yourpath/folder2 -name '*.log' -exec rm {} \; &
find yourpath/folder1 -mtime +5 -exec rm {} \;
OR
find yourpath/folder2 -mtime +5 |xargs rm
find foldername -exec rm -rf {} \; &
Juste au cas où vous voudriez faire plus que supprimer des répertoires en parallèle, vous pouvez faire beaucoup de choses fantaisistes en parallèle avec GNU parallel . Comme il ne s'agit souvent pas d'un utilitaire de base dans les distributions, vous devrez peut-être l'installer à l'aide de votre gestionnaire de paquets préféré, par exemple. apt-get install parallel
.
Mais ensuite, vous pouvez faire des choses intéressantes comme celle-ci, par exemple, vous exécutez 4 processus parallèles, souhaitez afficher l'état d'avancement, aucune notification de rappel et laissez en parallèle exécuter une commande de veille en attente de 5s, 10s, 15s, 20s chacun.
$ parallel -j 4 --progress --no-notice sleep ::: 5 10 15 20
Computers / CPU cores / Max jobs to run
1:local / 4 / 4
Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete
local:0/4/100%/5.0s
Votre exemple fonctionnerait comme ceci:
$ parallel --no-notice rm -rf ::: dir1 dir2 dir3
N'hésitez pas à consulter le tutoriel fine .
J'ai dû nettoyer des dossiers dans/media aussi vite que possible.
La commande suivante a permis de supprimer 9T de données sur chacun des 80 disques en environ 5mn.
$ Sudo find /media -maxdepth 2 -name "data-8" -type d | while read folder; do eval "Sudo rm -rf ${folder} &"; done
Cela a lancé 80 rm -rf
parallèle en arrière-plan
Solution simple: allez dans le dossier de destination et faites rm -r 'une regex', les noms de dossiers qui correspondent à la regex seront supprimés.
Si quelqu'un revient ici pour la même solution. Je suppose que c'est beaucoup plus facile de le faire comme ceci:
allez dans le dossier où vous avez d'autres sous-dossiers ou fichiers que vous voulez supprimer en bloc. Permet de l'appeler target_folder
donc
cd target_folder
tapez ls -la
et entrez
[home@target_folder]$ ls -la
Il listera tous les sous-dossiers et fichiers. Maintenant, dernière étape. Type:
[home@target_folder]$ rm -rf {folder1,folder2,folder3,so on...}
Double-cliquez simplement sur le nom du fichier et faites un clic droit pour le coller et c’est à peu près tout. Une fois que vous avez fini de répertorier tous les noms de fichiers, appuyez sur Entrée et wolla..Tous les dossiers ou fichiers seront supprimés.