No unix, desejo copiar todos os arquivos com uma determinada extensão (todos os arquivos do Excel) de todos os subdiretórios para outro diretório. Eu tenho o seguinte comando:
cp --parents `find -name \*.xls*` /target_directory/
Os problemas com este comando são:
Ele copia a estrutura do diretório também, e eu só quero os arquivos (então todos os arquivos devem terminar em / target_directory /)
Ele não copia arquivos com espaços nos nomes dos arquivos (que são alguns)
Alguma solução para esses problemas?
find... exec mv
?Respostas:
--parents
está copiando a estrutura de diretório, então você deve se livrar disso.A maneira como você escreveu isso é
find
executado e a saída é colocada na linha de comando de forma quecp
não possa distinguir entre os espaços que separam os nomes dos arquivos e os espaços dentro do nome do arquivo. É melhor fazer algo comono qual
cp
é executado para cada nome de arquivo quefind
encontra e passa o nome do arquivo corretamente. Aqui estão mais informações sobre essa técnica.Em vez de tudo acima, você pode usar zsh e simplesmente digitar
zsh
pode expandir curingas para incluir subdiretórios e torna esse tipo de coisa muito fácil.fonte
Bash
4.0+ eksh93
também suporta**
. Para bash, useshopt -s globstar
para habilitá-lo. Para ksh, éset -G
ouset -o globstar
.find . -name '*.xls' -print0 | xargs -0 cp -t destdir
De todos os itens acima, eu vim com esta versão. Esta versão também funciona para mim no terminal de recuperação do mac.
Ele irá procurar no diretório atual e recursivamente em todos os subdiretórios por arquivos com a extensão xsl. Ele os copiará todos para o diretório de destino.
Os sinalizadores cp são:
fonte
Eu tive um problema parecido. Eu resolvi usando:
O
'{}'
e";"
executa a cópia em cada arquivo.fonte
Eu também tive que fazer isso sozinho. Fiz isso por meio do argumento --parents para cp:
fonte
você pode remover o --parents, mas existe o risco de colisão se vários arquivos tiverem o mesmo nome.
fonte