Como copiar e renomear arquivos listados no arquivo TXT?

1

Eu preciso copiar todos os arquivos listados no arquivo TXT de um local para outro.

/1132526906_tt_nad87_1.jpg  /thumb/t1132526906_tt_nad87_1.jpg
/1132526906_tt_nad87_10.jpg /thumb/t1132526906_tt_nad87_10.jpg
/1132526906_tt_nad87_11.jpg /thumb/t1132526906_tt_nad87_11.jpg
/1132526907_tt_nad87_12.jpg /thumb/t1132526907_tt_nad87_12.jpg
/1132526907_tt_nad87_13.jpg /thumb/t1132526907_tt_nad87_13.jpg
/1132526908_tt_nad87_14.jpg /thumb/t1132526908_tt_nad87_14.jpg

Eu posso criar um arquivo CSV e dividir source e target com algum caractere utilizável.

Exemplo

Eu gostaria de copiar o arquivo 1132526906_tt_nad87_1.jpg de ./ para /thumb/t1132526906_tt_nad87_1.jpg - renomear e mover.

Pergunta

Existe algum comando de linha de comando para fazer isso? Eu encontrei exemplos, mas esses exemplos só copiam (sem renomear).

UPDATE

Eu criei este script:

#!/bin/bash

input="/data/web/web/gallery/data.csv"

while IFS=',' read from to
do
    echo "from: $from, to: $to"
done < "$input"

mas nenhuma linha é "ecoada", parece que data.csv arquivo não é lido. Há algo de errado?

    
por Artegon 22.09.2015 / 16:40

2 respostas

0

A partir do exemplo do OP, a renomeação e a mudança parecem bastante consistentes, por exemplo, filename.jpg parece sempre prefixado com o mesmo caminho mais um "t" se tornando thumb/tfilename.jpg . Se este for o caso, então é possível fazer algo mais simples.

Se todos forem destinados ao diretório "thumb /".

Tenha os arquivos de teste abc.jpg, xyz.jpg no diretório atual.

Aqui está uma lista de arquivos de amostra

$ cat testfile
abc.jpg
xyz.jpg

Teste

É útil testar a versão do comando com um eco para ver o que o código fará:

$ while read my_file; do
   echo cp -a "$my_file" "thumb/t$my_file"
done < testfile

Resultado do teste:

cp -a abc.jpg thumb/tabc.jpg
cp -a xyz.jpg thumb/txyz.jpg
  • while read my_file; do ... done sintaxe processará stdin, linha por linha
  • < testfile usa < para redirecionar testfile para stdin, então a instrução while lê
  • my_file é uma variável que fizemos para conter a entrada, que, como vemos no corpo do código, pode ser referenciada com $my_file
  • use aspas para evitar possíveis problemas se os nomes de arquivos tiverem espaços ou outros caracteres estranhos que possam quebrar os espaços que o comando cp usa para reconhecer argumentos

Final

Se estiver satisfeito com os resultados do eco de teste, podemos remover o eco para realmente executar o comando:

$ while read my_file; do
  cp -a "$my_file" "thumb/t$my_file"
done < testfile

Quando você verificar o diretório thumb/ , verá os dois arquivos de teste copiados lá.

Final, com Feedback

Por padrão, cp não fornece feedback, a menos que haja erros. Então, se você está copiando centenas ou milhares de arquivos, pode parecer que nada está acontecendo. Para ver o feedback, use a opção detalhada -v :

$ while read my_file; do
  cp -av "$my_file" "thumb/t$my_file"
done < testfile

Resultado:

'abc.jpg' -> 'thumb/tabc.jpg'
'xyz.jpg' -> 'thumb/txyz.jpg'
    
por 22.09.2015 / 17:33
0

Isso é mais simples com xargs :

< file-list.txt  xargs -n2 cp -v
    
por 14.04.2018 / 14:54