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.
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/