Eu estava esperando:
cp -R src/prog.js images/icon.jpg /tmp/package
resultaria em uma estrutura simétrica no dir de destino:
/tmp
|
+-- package
|
+-- src
| |
| +-- prog.js
|
+-- images
|
+-- icon.jpg
mas em vez disso, ambos os arquivos são copiados em / tmp / package. Uma cópia plana. (Isso está no OSX).
Existe uma função bash simples que posso usar para copiar todos os arquivos, incluindo arquivos especificados por curinga (por exemplo, src / *. Js) em seu devido lugar no diretório de destino. Um pouco como "para cada arquivo, execute mkdir -p $(dirname "$file"); cp "$file" $(dirname "$file")
", mas talvez um único comando.
Este é um tópico relevante, o que sugere que não é possível. A solução do autor não é tão útil para mim, porque eu gostaria simplesmente de fornecer uma lista de arquivos, curinga ou não, e ter todos eles copiados para o diretório de destino. IIRC MS-DOS xcopy faz isso, mas parece não haver equivalente para cp.
cp --parents
é uma opção ilegal no OSX (BSD cp), masgcp
(GNU cp) funciona bem. Se ainda não estiver em seu sistema, usebrew install coreutils
. Você terá muitos utilitários com prefixo g.cp -R --parents
ersync -rR
copia arquivos e diretórios relativamente.Mão única:
fonte
-C
opção de fazer o chdir para você -tar cf - _files_ | tar -C /dest xf -
ou algo parecido.Como alternativa, se você for da velha escola, use cpio:
Claramente, você pode filtrar a lista de arquivos conforme desejar.
A opção '-p' é para o modo 'pass-through' (em oposição a '-i' para entrada ou '-o' para saída). O '-v' é prolixo (lista os arquivos à medida que são processados). O '-m' preserva os tempos de modificação. O '-B' significa usar 'blocos grandes' (onde blocos grandes são 5120 bytes em vez de 512 bytes); é possível que não tenha nenhum efeito hoje em dia.
fonte
-print0
com a combinação de--null
opção para que não seja interrompida com caracteres especiais e tais:find . -print0 | cpio -pvdmB --null /target
cpio
para essa tarefa. Eu concordo que as opções-print0
e-null
devem ser usadas, caso contrário, em algum momento, alguém lhe dará algumas pastas com 'caracteres especiais' (espaços, provavelmente) e algo acontecerá. Não que eu esteja falando por experiência própria, mas você pode tentar fazer backup de um monte de arquivos e acabar com o backup da metade deles devido aos espaços estarem nos nomes dos arquivos. (Ok, estou falando por experiência própria.)cpio
o mostrado se os nomes de arquivo contiverem novas linhas - então você normalmente acaba com uma mensagem de erro sobre dois (ou mais) nomes de arquivo não sendo encontrados para cada nova linha em um nome de arquivo. (Às vezes, você pode receber menos mensagens - mas isso requer um cuidado considerável na construção do caso de teste.). Quando useicpio
, não havia--null
opção; As opções de traço duplo não faziam parte das notações de opção do SVR4, e o conceito de-print0
não estava presente emfind
nenhuma delas. Mas isso foi há muito tempo (meados dos anos 90, por exemplo. Antes do Linux alcançar o domínio).xargs
na combinação - ele se divide em espaços em branco - espaços em branco, tabulações, novas linhas. OTOH, não tenho certeza de como ou por que você faria isso. Ocpio
manual GNU no modo de saída é claro sobre um nome de arquivo por linha. O manual do usuário do SVR4 (impresso em 1990) é mais vago:cpio -o
(modo de cópia) lê a entrada padrão para obter uma lista de nomes de caminho e copia esses arquivos na saída padrão junto com o nome do caminho e as informações de status. Há uma chance, portanto, de que ele quebrou nomes em espaços.A opção -R do rsync fará o que você espera. É uma copiadora de arquivos com muitos recursos. Por exemplo:
Resultados da amostra:
fonte
rsync, é claro! tutorial aqui. e aqui
Ou uníssono
fonte
Experimentar...
então, pelo que você estava fazendo originalmente ...
ou
fonte
echo
ou$v
aqui. Além disso, este método falhará se o diretório correspondente não existir no destino.