Eu tenho uma estrutura de pastas com um monte de arquivos * .csv espalhados pelas pastas. Agora eu quero copiar todos os arquivos * .csv para outro destino, mantendo a estrutura da pasta.
Funciona fazendo:
cp --parents *.csv /target
cp --parents */*.csv" /target
cp --parents */*/*.csv /target
cp --parents */*/*/*.csv /target
...
e assim por diante, mas eu gostaria de fazer isso usando um comando.
'{}'
funciona da mesma maneira #-execdir
seja mais seguro do que isso-exec
, simplesmente substituir um pelo outro não preserva a estrutura da pasta conforme planejado.Você também pode usar
rsync
para isso.Se você deseja manter diretórios vazios da árvore de origem, pule a
--prune-empty-dirs
opção:Se você não deseja links simbólicos, datas de modificação, permissões de arquivo, proprietários etc. preservados, substitua
-a
por outra combinação de-rlptgoD
. ;-)fonte
-m
é um atalho para--prune-emty-dirs
.-R
opção pode ser adicionada para copiar a estrutura de diretórios pai da origem. (cf. minha resposta aqui.)Você pode usar o find e o cpio no modo de passagem
Ele encontrará todos os arquivos .csv no diretório atual e abaixo e os copiará para / target, mantendo a estrutura de diretórios enraizada
.
.Se você usar
ele encontrará todo o arquivo em
/path/to/files
e abaixo e os copiará para/target/path/to/files
e abaixo.fonte
O
cp
comando permite vários argumentos de origem:CAVEAT: Estou usando um globo recursivo aqui; esta é a
globstar
opção no Bash 4+ eksh
, e é suportada por padrão emzsh
. Globs recursivos não correspondem a arquivos e pastas ocultos, e algumas implementações seguem links simbólicos, enquanto outras não .Se o seu shell não suportar globs recursivos, ou se você preferir não usá-los, faça o seguinte:
*.csv */*.csv */*/*.csv */*/*/*.csv
- isto é obviamente muito redundante e requer saber quão profunda é a sua estrutura de diretórios.$(find . -name '*.csv')
- Isso vai coincidir com pastas e arquivos ocultos.find
também suporta especificar se os links simbólicos são ou não seguidos, o que pode ser útil.fonte
shopt -s globstar
imediatamente antes do meu comando e está tudo bem. Obrigado pelo seguimento!--parents
era o que eu estava procurando. obrigadoEste funcionou para mim:
find -name "*.csv" | xargs cp --parents -t /target
fonte
find [things] | xargs [do stuff]
é muito poderoso.find -print0
exargs -0
.Supondo que você deseja replicar essa estrutura de
./source
para./destination
:Estou preparado para contar isso como uma linha,
cd source
sendo uma concha embutida.fonte
tar
tem a-C
opção de evitar a necessidade de alterar o diretório primeiro.Da página de
rsync
manual:Então, isso funcionaria também:
fonte