Shell Script pour déplacer des dossiers contenant un mot spécifique

Je search un script shell simple pour mv tous les dossiers dans /var/www/uploads/ contenant Math ou Physique dans le nom de /mnt/Backup/ .

Je n'ai jamais fait quelque chose comme ça auparavant, en raison du fait que je suis nouveau à shell scripts. Recherché sur le web et malheureusement, je n'ai trouvé que des scripts pour déplacer des files spécifiques. Y a-t-il quelqu'un qui pourrait aider?

Selon ce message SO: utilisez xargs pour mv le directory "find" dans un autre directory
j'utiliserais quelque chose comme:

  find /var/www/uploads/ -type d \( -name '*Physics*' -o -name '*Math*' \) \ -exec mv -t /mnt/Backup/ {} + 

Cela finda n'importe quel directory à n'importe quelle profondeur dans votre dossier /var/www/uploads et le déplacera vers le dossier de sauvegarde.
Si vous voulez limiter la search au premier niveau, vous pouvez append pour find l'option -maxdepth 1

 find /var/www/uploads/ -maxdepth 1 -type d \( -name '*Physics*' -o -name '*Math*' \) \ -exec mv -t /mnt/Backup/ {} + 

Et si vous voulez avoir une search insensible à la casse, vous pouvez utiliser l'argument -iname au lieu de -name donc il ressemble à:

  find /var/www/uploads/ -type d \( -iname '*Physics*' -o -iname '*Math*' \) \ -exec mv -t /mnt/Backup/ {} + 

Remarque:
cela ne fonctionnera qu'avec les versions récentes de GNU ou FreeBSD find et mv ( -iname , -maxdepth et -t ne sont pas standard).

J'utilise aussi \ pour append le jumpline dans la command line et le rendre plus lisible.

Note 2:

Si vous voulez avoir une bonne compréhension de la command, vous pouvez essayer ce lien ExplainShell

J'utilise la command unix find , avec l'option -d pour searchr des directorys uniquement, et je lui request d'exécuter la command pour déplacer le directory vers / mnt / Backup. Au lieu d'utiliser une expression rationnelle pour le faire en une seule étape, j'exécuterais simplement la command deux fois, comme ceci:

 find /var/www/uploads -type d -name "*Math*" -exec mv {} /mnt/Backup/ \; find /var/www/uploads -type d -name "*Physics*" -exec mv {} /mnt/Backup/ \; 

Si vous voulez faire la même chose pour un grand nombre de noms de directorys, afin de ne pas avoir à répéter les noms, vous pouvez utiliser une variable à la place:

 for name in Math Physics; do find /var/www/uploads -d -name "*${name}*" -exec mv {} /mnt/Backup/ \; 
 #! /bin/bash shopt -s extglob # replace echo with mv when output OK echo /var/www/uploads/*@(Math|Physics)* /mnt/Backup/