Mac OS X combina cp e cat para copiar e renomear seqüencialmente arquivos na lista

3

Estou usando um modelo MacBook Pro OS X 2013. Eu tenho uma lista de nomes de arquivos em um arquivo de texto chamado list.txt separado por quebras de linha

list.txt exatamente assim, mas esta lista será longa

e.jpeg
x.jpeg
a.jpeg
m.jpeg
p.jpeg
l.jpeg
e.jpeg

Eu preciso desses comandos para copiar os mesmos arquivos para a pasta de destino milhares de vezes e estou correndo para o problema de nome de arquivo duplicado. Eu preciso copiar os arquivos novamente, mas eu acho que se eu os renomeio sequencialmente, como eles são copiados para a nova pasta, então eu não vou correr para os nomes duplicados. Eu estou copiando o mesmo aprox. 40 arquivos repetidamente milhares de vezes, dependendo da ordem em que aparecem em list.txt . Cada arquivo está entre 100 KB e 250 KB.

Eu quero copiar cada arquivo na ordem em que eles estão listados em list.txt para outra pasta e renomeá-los sequencialmente

Eu usei isso para copiar os arquivos para a nova pasta e ela funcionou, não manteve ou renomeou as duplicatas.

cp 'cat list.txt' new-folder/

Estou usando isso para renomeá-los sequencialmente, mas eles são renomeados na pasta errada

find . -name '*.jpeg' \
| awk 'BEGIN{ a=0 }{ printf "mv %s %04d.jpeg\n", $0, a++ }' \
| bash

Eu tenho tentado combiná-los usando isso sem sorte:

cat [filename] | while read line; do [command] "$line"; done

Eu tentei várias combinações disso:

cp 'cat list.txt' new-folder/ | while read line; do find . -name '*.jpeg' \
| awk 'BEGIN{ a=0 }{ printf "mv %s %04d.jpeg\n", $0, a++ }' \
| bash "$line"; done

Eu preciso que os arquivos apareçam na pasta new na ordem list.txt, porque vou usá-los pela data de criação de data / adição para o projeto. Eu posso ter que colocar um atraso para cada linha até que ela seja copiada e renomeada.

    
por timothy norris 18.01.2015 / 22:59

1 resposta

1

Não tente criar um script de shell a partir de uma lista de arquivos, é difícil acertar e quase sempre muito mais difícil do que executar diretamente o que você precisa para executar. Em vez disso, quando você tiver o nome do arquivo disponível, vá em frente e renomeie-o.

#!/bin/sh
number=1
while IFS= read -r old_name; do
  new_name=$(printf %04d "$number").jpeg
  number=$((number+1))
  mv -- "$old_name" "new-folder/$new_name"
done <list.txt
    
por 19.01.2015 / 00:06

Tags