Questão Linux: como copiar um arquivo com um determinado padrão de nome para o qual o local exato na complexa estrutura de diretórios é desconhecido


Eu quero copiar todos os arquivos com o nome XYZ * em uma pasta. O problema é que os arquivos estão em subpastas diferentes e nem a profundidade da estrutura de pastas é a mesma para todos os arquivos. Felizmente, pelo menos cada arquivo tem um nome único.

Claro, eu pensei sobre o comando cp, mas acho que a profundidade da estrutura de pastas precisa ser a mesma para que isso funcione.


4


origem




Respostas:


Se você quiser evitar iniciar muitos processos separados (como usar find ... -exec cp ... pode fazer) usando bash (e não tem zsh para sua forma **) você pode fazer um único cp da seguinte forma:

cp -p $(find path/to/src -name 'XYZ*') path/to/dest

O formulário $ (...) é uma versão posix da substituição de processo com aspas invertidas. A seguir, um exemplo.

find . -name 'd*a'
cp -p $(find . -name 'd*a') ../zeta
ls ../zeta

Esses comandos produziram a seguinte saída:

./.?/dx2a
./.?/dx4a
./.tdot1/dx1a
./.tdot2/dx2a
cp: will not overwrite just-created `../zeta/dx2a' with `./.tdot2/dx2a'
dx1a  dx2a  dx4a

7





Você pode usar encontrar por esta:

$ find path/to/src -type f -name XYZ\* -exec cp -p {} path/todest/ \;

2





Se você usar zsh em vez de bash, poderá fazê-lo com o padrão ** file glob. Isso corresponde recursivamente a todas as subpastas.

cp path/to/src/**/XYZ* path/to/dest

1