Como recursivamente copiar um diretório usando o cpio?

1

Como faço para copiar recursivamente um diretório dentro da lista em my-files-to-copy.txt ?

cd my/source/dir
cpio --create < my-files-to-copy.txt | (cd my/dest/dir && cpio --extract)
my-files-to-copy.txt
src/main.js
src/routes/index.js
src/my-app/ # a directory with it's own child tree I want to recursively copy
    
por Mowzer 11.11.2018 / 11:17

2 respostas

1

Eu tenho medo cpio realmente não pode fazer isso, a menos que você faça algum script extra para detectar o nome do diretório e percorra-o para extrair os nomes de caminho de todos os arquivos abaixo dele, como forma de "pré-processamento "seu arquivo de lista.

Seria muito mais fácil usar outra ferramenta, como rsync (observe o extra -r após --files-from !):

rsync -a --files-from=my-files-to-copy.txt -r my/source/dir my/dest/dir

... ou pax ( utilitário padrão ):

( cd my/source/dir && pax -w ) <my-files-to-copy.txt |
( cd my/dest/dir   && pax -r )

... ou com pax se você puder fornecer um caminho absoluto para o diretório de destino:

( cd my/source/dir && pax -rw /my/dest/dir ) <my-files-to-copy.txt

... ou BSD tar (use -T ou --files-from= em vez de -I com GNU tar ):

tar -c -f - -C my/source/dir -I my-files-to-copy.txt |
tar -x -f - -C my/dest/dir

Isso tudo assume que my-files-to-copy.txt reside no diretório atual e que esse diretório pode ser diferente do diretório my/source/dir .

    
por 11.11.2018 / 15:26
-1

Como mencionado anteriormente nos comentários, cpio suporta o que você gosta. Use, por exemplo:

find src/main.js src/routes/index.js src/my-app/ | cpio -pdm my/dest/dir

A armadilha deste método é que você precisa executar dois processos de uma maneira que não acelere, já que find precisa para stat(2) todos os arquivos e cpio também precisa stat(2) all file algum tempo mais tarde e cpio usa apenas um único processo para fazer a cópia real.

... ou você poderia fazer isso da maneira mais eficiente usando minha própria ferramenta, star (a mais antiga implementação de taragem gratuita):

star -copy -p -find src/main.js src/routes/index.js src/my-app/ my/dest/dir

Isso é eficiente porque star usa libfind no processo star , só precisa chamar stat(2) uma vez por arquivo e bifurca um segundo processo que cria os novos arquivos simultaneamente para o processo principal star lê os arquivos.

Para evitar uma desaceleração desse método, os processos star compartilham o conteúdo do arquivo e os metadados do arquivo por meio da memória compartilhada.

BTW: é claro que você pode substituir a lista de arquivos dos meus exemplos por algo como:

' cat my-file-list.txt ' 
    
por 11.11.2018 / 15:52