Copie arquivos de uma lista para uma pasta

3

Eu tenho um arquivo de texto abc.txt e seu conteúdo é:

   /lag/cnn/org/one.txt
   /lag/cnn/org/two.txt
   /lag/cnn/org/three.txt

Se eu usar:

$ tar -cvf allfiles.tar -T abc.txt

Estou recebendo o tar de arquivos na lista. Da mesma forma, é possível copiar esses arquivos em abc.txt para uma pasta?

Eu tentei isso:

$ cp --files-from test1.txt ./Folder

Mas não está funcionando.

    
por Mano 22.12.2013 / 09:55

4 respostas

6

Observe que o comando padrão (POSIX / Unix) para criar um arquivo tar é pax . pax combina os comandos tradicionais cpio e tar .

Para criar um arquivo tar, use o modo de gravação:

pax -w < abc.txt > allfiles.tar

Para copiar, use o modo de cópia:

pax -rw < abc.txt Folder/

Observe que ele recria a estrutura de diretórios em Folder . Se você quiser achatar, você poderia fazer:

pax -rws '|.*/||' < abc.txt Folder/

(consulte a man page se você deseja copiar permissões ou outros atributos também. pax espera um arquivo por linha, o que significa que arquivos cujo nome contém caracteres de nova linha não podem ser copiados dessa forma, alguns pax implementações suportam um -0 para permitir uma lista de arquivos delimitados por NUL ).

com cpio :

cpio -pd < abc.txt Folder/

Com o GNU tar :

tar -cf - -T abc.txt | (cd Folder && tar xf -)

Outra opção para permitir qualquer caractere em nomes de arquivos é (com GNU cp ):

xargs cp -t Folder < abc.txt

(que achata os diretórios).

xargs espera uma lista separada em branco (espaço, tabulação, nova linha), quando você pode escapar desses separadores com contrabarra, aspas simples ou duplas. Então você pode ter uma lista como:

"file with space"
other-file
'file with "quote" and
newline'
    
por 22.12.2013 / 13:08
5

Não tenho certeza onde você leu que o cp tem uma opção --files-from , mas eu certamente não tenho isso usando o GNU coreutils 8.22.

Contanto que seus nomes de arquivos não possuam novas linhas, você pode fazer isso (com bash4 +):

mapfile -t files < test1.txt
cp -- "${files[@]}" Folder/

Se você não tem bash4 +, você pode preencher manualmente um array e usá-lo (ou apenas chamar cp diretamente de dentro de read para cada arquivo, mas isso será mais lento):

while IFS= read -r file; do
    files+=( "$file" )
done < test1.txt
cp -- "${files[@]}" Folder/
    
por 22.12.2013 / 10:00
3

Você pode conseguir isso com um script simples:

for i in $(cat path_to_abc.txt)
do 
  cp "$i" path_to_Folder
done

Uma maneira mais segura de lidar com nomes de arquivos arbitrários:

while IFS= read -r file; do 
    cp -- "$file" path_to_Folder
done
    
por 22.12.2013 / 10:04
1

cp não tem uma opção --files-from (pelo menos, o GNU cp não) mas rsync :

rsync --files-from abc.txt -av / Folder/

O / é usado se o arquivo test.txt contiver arquivos com caminhos absolutos. Caso contrário, deve ser a raiz da fonte.

Se seus arquivos forem terminados com zeros ao invés de terminados com novas linhas, você deve incluir a opção --from0 .

    
por 04.07.2017 / 23:37