Move todos os arquivos dentro das pastas, começando com string

0

Estou tentando usar o seguinte comando:

find . -type d -name "2016*" -exec mv {}/* ../../../Pictures/2016/ \;

Para mover todos os arquivos em qualquer pasta, começando com 2016 para outra pasta chamada Pictures / 2016. Não está dando nenhum arquivo / diretório encontrado, no entanto, o eco dá isto:

mv ./2016-02-13/* ../../../Pictures/2016/

Alguma ideia de pessoas inteligentes do Stack Exchange?

    
por StueyCIDESO 20.07.2017 / 16:21

1 resposta

1

Usando subshells com find

O * será expandido pelo seu shell antes de find vê-lo, então está errado - pode até causar perda de dados. Você não pode citar, porque então não será expandido de todo.

O que você precisa é de um subshell que receba a pasta como um argumento e faça a expansão mais tarde:

find . -type d -name '2016*' -exec sh -c 'mv -- "$0"/* /path/to/target/' {} \;

O -- impede que arquivos com um - inicial sejam interpretados como mv e você deve citar o nome da pasta em "$0" .

Usando puro Bash

Uso alternativo de globalização recursiva com Bash ≥ 4.0:

shopt -s globstar
mv **/2016*/* /path/to/target/

Eu acho que isso é muito mais limpo, apesar de quebrar com um número muito grande de arquivos.

    
por 20.07.2017 / 16:43

Tags