web-dev-qa-db-fra.com

Comment supprimer plusieurs dossiers en parallèle?

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.

5
vivek

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

Modifier :

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.

  • supprimer des fichiers par taille
  • find /yourpath/folder1 -size +1048576 -exec rm -f {} \; &
    find /yourpath/folder2 -size +1048576 -exec rm -f {} \; &
    
  • supprimer des fichiers par extension
  • 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 {} \; &
    
  • supprimer des fichiers par heure modifiée
  • find yourpath/folder1 -mtime +5 -exec rm {} \;
    

    OR

    find yourpath/folder2 -mtime +5 |xargs rm 
    
  • suppression du dossier et de ses sous-dossiers, y compris ses fichiers
  • find foldername -exec rm -rf {} \; &
    

     example folder & sub folder structure

    8
    Raju

    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 .

    5
    ferdy

    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

    1
    Franck

    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.

    0

    Si quelqu'un revient ici pour la même solution. Je suppose que c'est beaucoup plus facile de le faire comme ceci:

    1. 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
      
    2. tapez ls -la et entrez

      [home@target_folder]$ ls -la
      
    3. 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.

    0
    Learner