Você pode usar localizar e cpio para fazer isso
cd /top/level/to/copy
find . -name '*.txt' | cpio -pdm /path/to/destdir
(-updm for overwrite destination content.)
Na linha de comando do Linux, gostaria de copiar um conjunto (muito grande) de .txt
arquivos de um diretório (e seus subdiretórios) para outro.
Eu preciso que a estrutura de diretórios permaneça intacta e preciso ignorar os arquivos, exceto os que terminam em .txt
.
cd /source/path
find -type f -name \*.txt -exec install -D {} /dest/path/{} \;
Outra abordagem
find . -name '*.txt' -exec rsync -R {} path/to/dext \;
A maneira mais fácil que funcionou para mim:
cp --parents -R jobs/**/*.xml ./backup/
uma captura é que você tem que navegar para o diretório "desejado" antes, então o "caminho pai" está correto.
Verifique também se você ativou globs recursivos no bash:
shopt -s globstar
Que tal você primeiro copiá-lo com
cp -r /old/folder /new/folder
depois vá para a nova pasta e execute
find . -type f ! -iname "*.txt" -delete
ou apenas
cp -r /old/folder /new/folder && find . -type f ! -iname "*.txt" -delete
Edit: ok você quer um comando que filtra (eu não testei isso porque meu sistema não tem o comando cpio
!). Aqui é onde eu o encontrei: link
find . -name "*.txt" -print0 |
cpio -pmd0 /dest-dir
Por favor teste isso primeiro, porque ainda não experimentei. Se alguém verificasse, isso seria ótimo.
Navegue até o diretório:
find . -regex '<regexp_to_get_directories_and_files_you_want>' | xargs -i cp -r --parents {} path/to/destination
É um pouco mais direto e poderoso, se você gerencia expressões regulares.
Navegue até o diretório:
cp '*.css' /path/to/destination
Você terá que navegar para cada pasta no diretório, mas isso é melhor do que a maioria das opções que vi até agora.