Copia uma lista de arquivos que preservam a estrutura de diretórios, sem scripts

2

Existe uma maneira de copiar uma lista de arquivos que compartilham um diretório base comum, preservando sua estrutura de diretórios relativa? Os arquivos com caminhos relativos são listados em um arquivo de texto. edit Eu tenho os nomes dos arquivos listados em um arquivo de texto simples.

Eu gostaria de fazer isso sem usando um script (sem bash / batch / python / ruby / lua / etc.), semelhante a como wget -i funciona para URLs. (Meu motivo é que ele forneceria uma solução de sobrecarga / não padrão para uma tarefa razoavelmente comum).

Eu tentei cat list.txt | xargs -I % cp % new_folder de Copiar lista de arquivos , mas isso não aconteceu preservar o caminho do diretório relativo.

Eu faria isso para exportar minha seleção de arquivos (que eu já possuo em um arquivo de texto) de uma estrutura de diretórios que tenha um grande número de arquivos (acontece de tempos em tempos).

    
por n611x007 31.10.2013 / 19:18

3 respostas

4

tar cvf - ./filesAndDirecotries | (cd targetDirectory; tar xvf - )

O TAR (Arquivo de Fita é um comando antigo para criar um arquivo) pode gravar em stdin ("-" parâmetro para o arquivo) e canalizar e ler a partir de stdin no segundo diretório.

O comando acima primeiro cria um arquivo tar e grava em stdin e canaliza para um shell e altera o diretório e descompacta o arquivo lendo-o de stdin.

    
por 31.10.2013 / 23:16
4

A resposta do unixUser me colocou no caminho certo. Acontece que tar pode fazer a leitura de nomes de arquivos e diretórios de um arquivo de texto com -T e pode até mesmo alterar o diretório com -C :

tar cvf - -T filelist.txt | tar xvf - -C newdir

Isso responde a pergunta que eu tinha.

fontes

Para obter essas informações da ideia que unixUser me forneceu , eu abaixado para arquivos tar do arquivo de texto , levando a trpn 's (Q) e Tinkster < A (a) conversão em linuxquestions.org . Ao mesmo tempo, verifique a página de manual do alcatrão para qualquer opção que tenha algo a ver com arquivo , ambas as pesquisas levou para a opção -T ! Para evitar confiar no shell para mudar de diretório, eu também pesquisou para qualquer opção relacionada diretório e encontrou a opção -C . - Eu vejo que tar é provavelmente o comando para agrupar (cópias de) arquivos de várias maneiras.

Com isso, pode-se usar algum binário de alcatrão sem * depender de scripts. É incrível como é útil o alcatrão.

(*: fora da preferência : eu encontro o bash / perl / python / qualquer que seja uma ferramenta muito geral para esta tarefa bastante exata . No entanto, como apontou por grawity , os tubos são convenientes - sem eles , um deve ser forçado a criar um arquivo intermediário, por exemplo, tar cvf intermediate.tar -T filelist.txt e tar xvf intermediate.tar -C newdir .)

    
por 01.11.2013 / 13:18
1

Tecnicamente, o seu exemplo já usa o bash. E é exatamente por isso que o shell é scriptável em primeiro lugar - é uma tarefa tão simples que não há necessidade de uma ferramenta / programa dedicado apenas para isso.

cat list.txt | xargs -n1 dirname | sort | uniq | xargs -I% mkdir -p new_folder/%
cat list.txt | xargs -I% cp % new_folder/%

Ou:

cat list.txt | while read path; do
    mkdir -p "new_folder/${path%/*}" && cp "$path" "new_folder/$path"
done

Ou:

cat list.txt | xargs -I% install -Dm0644 % new_folder/%

Ou:

cat list.txt | while read path; do
    install -Dm0644 "$path" "new_folder/$path"
done

( install é menor, mas não preserva modos, infelizmente.)

    
por 31.10.2013 / 20:14