Shell Script para mover pastas contendo uma palavra específica

3

Estou procurando um script de shell simples para mv todas as pastas em /var/www/uploads/ que contêm Math ou Physics no nome para /mnt/Backup/ .

    
por SaulGoodman 20.02.2014 / 11:20

3 respostas

2

De acordo com este SO Post: use xargs para mv o diretório “find” em outro diretório
eu usaria algo como:

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

Isso localizará qualquer diretório em qualquer profundidade na sua pasta /var/www/uploads e o moverá para o diretório de backup.
Se você quiser limitar a pesquisa ao primeiro nível, pode adicionar para encontrar a opção -maxdepth 1

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

E se você quiser fazer uma pesquisa sem distinção entre maiúsculas e minúsculas, poderá usar o argumento -iname em vez de -name , por isso parece:

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

Nota:
 isso funcionará apenas com versões recentes do GNU ou FreeBSD find e mv ( -iname , -maxdepth e -t não são padrão).

Eu também uso \ para adicionar o jumpline na linha de comando e torná-lo mais legível.

Nota 2:

Se você quiser ter um bom entendimento do comando, tente este link do ExplainShell

    
por 20.02.2014 / 11:42
2

Eu usaria o comando unix find , com a opção -d para procurar apenas diretórios, e diga para executar o comando para mover o diretório para / mnt / Backup. Em vez de usar um regexp para fazer isso em uma etapa, eu simplesmente executaria o comando duas vezes, assim:

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

Se você quiser fazer a mesma coisa para um grande número de nomes de diretório, para não precisar repetir nomes, use uma variável:

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