Como encontrar todos os arquivos correspondentes (ou não correspondentes) a um padrão específico em uma pasta?

0

Como faço para encontrar todos os arquivos em uma pasta e suas subpastas terminados com 3 dígitos e mova-os para um novo local, mantendo a estrutura do diretório?

Como alternativa, como posso encontrar todos os arquivos cujos nomes não terminam com três dígitos?

    
por Lee 11.09.2015 / 20:56

2 respostas

4

Solução muito mais limpa, baseada em uma resposta vinculada por @don_crissti. ( Filtro Rsync: copiando somente um padrão )

rsync -av --remove-source-files --include='*[0-9][0-9][0-9]' --include='*/' --exclude '*' /tmp/oldstruct/ /tmp/newstruct/

E a negação:

rsync -av --remove-source-files --exclude='*[0-9][0-9][0-9]' /tmp/oldstruct /tmp/newstruct/

Resposta original:

Isso deve ser feito. Ele encontrará qualquer arquivo na estrutura que você cd terminar em 3 dígitos, criará uma pasta de destino no /tmp/newstruct e moverá o arquivo.

cd /tmp/oldstruct
find ./ -type f -regextype posix-basic -regex '.*[0-9]\{3\}' | 
  while read i; do 
    dest=/tmp/newstruct/$(dirname $i)
    mkdir -vp $dest
    mv -v $i $dest
  done

Eu recomendaria que você prefixe o mkdir e o mv com echo antes de executá-lo, apenas para garantir que ele faça o que você espera.

Para negar os 3 dígitos, basta colocar ! -regex .

Aqui está um método mais simples que depende do rsync. No entanto, ele chama rsync para cada arquivo que encontrar, então definitivamente não é muito eficiente.

find ./ -type f -regextype posix-basic -regex '.*[0-9]\{3\}' --exec rsync -av --remove-source-files --relative {} /tmp/newstruct
    
por 11.09.2015 / 21:17
0

Você pode fazer isso com o bash:

## Make ** match all files and 0 or more dirs and subdirs
shopt globstar
## Iterate over all files and directories
for f in **; do 
    ## Get the name of the parent directory of the 
    ## current file/directory
    dir=$(dirname "$f"); 
    ## If this file/dir ends with 3 digits and is a file
    if [[ $f =~ [0-9]{3} ]] && [ -f "$f" ]; then 
        ## Create the target directory
        mkdir -p targetdir1/"$dir"
        ## Move the file
        mv "$f" targetdir1/"$f" 
    else 
        ## If this is a file but doesn't end with 3 digits
        [ -f "$f" ] && 
        ## Make the target dir
        mkdir -p targetdir2/"$dir" &&
        ## Move the file
        mv "$f" targetdir2/"$f" 
    fi 
done
    
por 12.09.2015 / 12:27