Como copiar arquivos e renomear dinamicamente quando o nome do arquivo de origem contém espaços incorporados

1

Estou tentando copiar e renomear arquivos de imagem de um diretório para outro.

Os arquivos que eu quero copiar têm espaços em branco incorporados em seus nomes de arquivos, e eu quero substituir parte do nome do arquivo pela data em que a imagem foi tirada.

Abaixo está um exemplo dos nomes dos arquivos e do comando que tenho usado, junto com um exemplo das mensagens de erro que tenho visto.

Por exemplo, eu gostaria de copiar o arquivo "2008_08_17_Transfer 001.jpg" do diretório de origem e renomeá-lo para "20090314001.jpg" no diretório de destino e assim por diante, para cada arquivo no diretório de origem que começa com "2008_08_17_Transfer".

Aqui está o que eu tentei e as mensagens de erro que eu vejo:

$ ls -l
total 241968
-rw------- 1 stephen stephen  1347770 Mar 14  2009 2008_08_17_Transfer 001.jpg
-rw------- 1 stephen stephen  1077919 Mar 14  2009 2008_08_17_Transfer 002.jpg
-rw------- 1 stephen stephen  1359947 Mar 14  2009 2008_08_17_Transfer 003.jpg
-rw------- 1 stephen stephen  1309175 Mar 14  2009 2008_08_17_Transfer 004.jpg
-rw------- 1 stephen stephen  1404298 Mar 14  2009 2008_08_17_Transfer 005.jpg
...

for i in *.jpg ; do scp -p "$i" /media/stephen/WDMyBook1_ext4/PicturesRenamedByDateTaken/2009/20090314/20090314'echo "$i" ' ; done

001.jpg: No such file or directory
002.jpg: No such file or directory
003.jpg: No such file or directory
    
por Stephen Daddona 21.11.2016 / 01:37

2 respostas

2
for i in *.jpg ; do 
  cp -p "$i" "/media/stephen/WDMyBook1_ext4/PicturesRenamedByDateTaken/2009/20090314/20090314${i##* }"
done

A expansão do parâmetro do shell ${i##* } remove o prefixo mais longo que termina em um espaço (isto é, tudo até e incluindo o espaço antes do sufixo numérico 00n.jpg ). Não há necessidade de usar echo .

Estou assumindo que essa é uma cópia local para que você não precise de scp .

Nota: se você quiser derivar o 20090314 programaticamente do nome do diretório, isso é possível - mas obviamente complica um pouco as coisas.

    
por steeldriver 21.11.2016 / 01:50
0

Basta colocar aspas ao redor do nome do arquivo, como este

for i in *.jpg ; do scp -p "$i" "/media/stephen/WDMyBook1_ext4/PicturesRenamedByDateTaken/2009/20090314/20090314'echo "$i" '" ; done
    
por jsalatas 21.11.2016 / 01:52