Copie correspondências da pesquisa recursiva para um novo local

0

Eu quero pesquisar um diretório recursivamente e copiar todos os arquivos XML para um novo local. Eu posso identificar os arquivos com:

ls -R | grep .xml$

ou com caminhos completos com:

find . -name \*.xml

Os resultados das chamadas ls normais podem ser passados para cp da seguinte forma:

cp 'ls' ./newdir

Mas não consigo fazer com que essa abordagem funcione com pesquisas recursivas - cp lê mal a string grep resultante e cria muitos arquivos vazios. A pergunta SU mais próxima - usando locate - não consegue mover nenhum arquivo.

Editar:

Método alternativo:

find . -name \*.xml > xml_list.txt
while read p; do   cp $p ./newdir; done <xml_list.txt

.. resulta em uma lista de erros (mais longos que o número de linhas) no formato:

cp: pathfilenamesegment: No such file or directory

.. onde pathfilenamesegment são segmentos de cadeias de arquivos / caminhos que são separados por espaços. Bash aparentemente não está aplicando as strings como todos, mas em segmentos. O iterador, no entanto, está funcionando corretamente, pois a substituição de echo 1 imprime o mesmo número de vezes que as linhas em xml_list.txt .

Qualquer maneira de forçar o bash a reconhecer linhas como strings inteiras?

    
por geotheory 28.08.2015 / 13:55

1 resposta

2

Use find :

find . -name "*.xml" -exec cp -vt /newdir {} +

Isso procura todos os arquivos que terminam com .xml . Então find executa cp -vt /newdir neles. Com o + character find executa o comando cp como poucas invocações possíveis, encadeando tantos argumentos quanto o shell permitir.

Editar : se o seu cp não tiver a opção -t , use:

find . -name "*.xml" -exec cp -v {} /newdir/ \;
    
por 28.08.2015 / 14:13

Tags