copiando arquivos de um diretório para outro

5

Eu tenho que copiar um conjunto de arquivos de uma pasta para outra e estou usando o seguinte comando:

cp -rf 'head -n 100 /home/tmp/abc.txt' /home/tmp/test/files

o conteúdo do arquivo em abc.txt é como:

./folder1/example.tar.gz
./folder2/example.tar.gz
./folder3/example.tar.gz

Mas, ao executar o comando cp acima, estou recebendo:

cp: will not overwrite just-created '/home/tmp/test/files/example.tar.gz' with './folder3 /example.tar.gz'
cp: will not overwrite just-created '/home/tmp/test/files/example.tar.gz' with './folder1/example.tar.gz'

Eu posso entender isso porque o nome dos arquivos .gz são os mesmos que estão aparecendo no erro. O que eu quero fazer é ter a mesma estrutura de pastas dentro de /home/tmp/test/files , conforme listado em abc.txt , como:

/home/tmp/test/files/folder1/example.tar.gz
/home/tmp/test/files/folder2/example.tar.gz
/home/tmp/test/files/folder3/example.tar.gz

Mas estou recebendo apenas uma example.tar.gz dentro da pasta files depois de executar o comando cp acima.

Então, qual é a maneira de obter o que mencionei acima?

    
por Mano 17.08.2013 / 07:04

2 respostas

6

o cp não funciona

Seu exemplo, como está, não funcionará porque a cópia não copia as estruturas de diretório, ele copia apenas os arquivos, daí a mensagem de erro que você está encontrando. Para fazer uma cópia profunda como essa, você pode inscrever o comando tar e usar a construção tar cvf - --files-from=... | (cd /home/tmp/test/files/; tar xvf -) ou pode usar apenas rsync .

rsync

Se eu fosse você, usaria rsync para fazer isso da seguinte forma:

$ rsync -avz --files-from=abc.txt /src /home/tmp/test/files/.

Se você quiser apenas as primeiras 100 linhas do arquivo abc.txt , você pode fazer isso:

$ rsync -avz --files-from=<(head -n 100 abc.txt) /src /home/tmp/test/files/.

Exemplo

Dados da pasta de amostra:

$ tree /home/saml/tmp/folder*
/home/saml/tmp/folder1
'-- example.tar.gz
/home/saml/tmp/folder2
'-- example.tar.gz
/home/saml/tmp/folder3
'-- example.tar.gz

Agora copie os arquivos:

$ rsync -avz --files-from=<(head -n 3 /home/saml/tmp/abc.txt) \
         /home/saml/tmp/. /home/saml/tmp/test/files/.
building file list ... done
./
folder1/
folder1/example.tar.gz
folder2/
folder2/example.tar.gz
folder3/
folder3/example.tar.gz

sent 3147093 bytes  received 81 bytes  6294348.00 bytes/sec
total size is 3145728  speedup is 1.00

Confirme se foram copiados:

$ tree /home/saml/tmp/test/files
/home/saml/tmp/test/files
|-- folder1
|   '-- example.tar.gz
|-- folder2
|   '-- example.tar.gz
'-- folder3
    '-- example.tar.gz

tar

Se você estiver interessado, veja como você faz isso usando apenas tar .

$ cd /home/saml/tmp
$ tar cvf - --files-from=<(head -n 3 /home/saml/tmp/abc.txt) | (cd /home/saml/tmp/test/files/; tar xvf -)
./folder1/example.tar.gz
./folder1/example.tar.gz
./folder2/example.tar.gz
./folder2/example.tar.gz
./folder3/example.tar.gz
./folder3/example.tar.gz

Confirme se copiou:

$ tree /home/saml/tmp/test/files
/home/saml/tmp/test/files
|-- folder1
|   '-- example.tar.gz
|-- folder2
|   '-- example.tar.gz
'-- folder3
    '-- example.tar.gz
    
por 17.08.2013 / 07:27
0

O problema não é certamente que cp não copie estruturas de diretórios. Claro que sim: cp -r (recursivo).

O que cp , pelo menos POSIX cp , não faz é recriar os caminhos relativos dos operandos de origem no diretório de destino.

Se você cp a/b/file1 a/b/file2 a/c/file3 dest , você recebe dest/file1 dest/file2 dest/file3 .

Se o seu cp é o do GNU Coreutils, ele pode ter a opção --parents . Não tenho certeza quando isso foi introduzido. cp --parents induzirá% GNUcp a produzir esse mecanismo de recriação de caminho. Da documentação de informações:

--parents
  Form the name of each destination file by appending to the target
  directory a slash and the specified name of the source file.  The
  last argument given to 'cp' must be the name of an existing
  directory.  For example, the command:

      cp --parents a/b/c existing_dir

  copies the file 'a/b/c' to 'existing_dir/a/b/c', creating any
  missing intermediate directories.

Então, se você tem o GNU cp , a única mudança que você precisa é eliminar o -r , já que não estamos recursando, e usar --parents :

cp --parents -f 'head -n 100 /home/tmp/abc.txt' /home/tmp/test/files
    
por 22.05.2018 / 06:25