Copie todas as pastas para um novo local, exceto as que contenham caracteres inválidos.

1

O objetivo é criar um script Bash que copie todas as pastas e arquivos dentro de uma pasta para um novo local.

O nome da pasta de onde a cópia deve ocorrer deve sempre corresponder ao seguinte formato:

37ee0500-52c0-4a18-861e-0084EF05FB

As pastas estão localizadas em: /user/members/local/ e devem ser copiadas para: /user/members/clean/ .

Os scripts a seguir foram criados, mas nenhum deles atinge o objetivo.

Script um:

#!/bin/bash
echo $1;

if [[ "$1" =~ [^0-9A-Za-z]+ ]] ; then
echo "string $1 has characters which are not alphanumeric"
else
echo "string $1 has alphabets which are only alpha numeric"
fi

Saída:

./test: line 5: conditional binary operator expected
./test: line 5: syntax error near '=~'
./test: line 5: 'if [[ "$1" =~ [^0-9A-Za-z]+ ]] ; then'

Script dois

if grep '^[-0-9a-zA-Z]*$' <<<$1 ;
  then echo ok;
    else echo ko;
    fi

Saída:

./test 37ee0500-52c0-4a18-861e-0084EF05FB retorna ok e ./test 37ee0500-5@c0-4#18-861e-00-0P{9F05FB falha conforme esperado.

Atualização: Isso está funcionando;

#!/bin/bash

NEW="/user/members/local";
OLD="/user/members/clean";

mv $NEW $OLD;
mkdir $NEW;

cd $OLD;

for f in *; do 

if grep '^[-_.0-9a-zA-Z]*$' <<< "$f" ; 
  then echo $f OK; cp -ar $f $NEW/$f;
     else echo $f Failed;              
fi

done
    
por user214292 19.09.2014 / 18:17

1 resposta

2

Se você estiver em um sistema Linux com utilitários GNU (em oposição ao BusyBox ou outra coisa), você pode fazer isso de forma muito eficiente com find e cp :

find /src -maxdepth 1 -type d -regex '.*/[0-9A-Za-z-]+$' -exec cp -r -t /dst {} +

Isso localiza todos os diretórios no nível superior de /src que contêm apenas caracteres alfanuméricos ou hífens e, em seguida, transfere todos eles para cp para copiá-los recursivamente em /dst . A opção -t para cp permite especificar o "diretório de destino" primeiro, portanto, todos os argumentos restantes podem ser os itens que você deseja copiar. Isso permite que você use o {} + construct do find, o que faz com que ele passe o maior número possível para uma única invocação de cp (semelhante a xargs ). Dessa forma, se você tiver uma tonelada de diretórios para copiar, não estará chamando cp uma vez para cada um.

    
por 19.09.2014 / 21:09

Tags