rsync - movendo cada arquivo JPG / JPG de um disco rígido para um único diretório com um shell script

2

Estou procurando alguma direção - porque funciona, mas não funciona.

Eu tenho um disco rígido local e gostaria de copiar todos os arquivos .JPG e .jpg para um diretório single em outro disco rígido local.

usando o rsync - meu pensamento: (o disco rígido de origem é uma máquina windows - os nomes de arquivos têm espaços)
obter uma lista de todos os diretórios no disco rígido de origem e colocar em um arquivo de texto. - edite o arquivo de texto da lista dir para adicionar aspas em torno de cada diretório
- execute o rsync em cada linha do arquivo de texto usando o loop de script de shell



funciona se eu usar rysnc na linha de comando e copiar individualmente a dirctory.

rsync -r --include '*.jpg' --include '*.JPG' --exclude '*' --prune-empty-dirs /"media"/"tfrd"/"Disk06_01_M"/"Disk02_01_X"/"x_images and camera"/"vernon pics_other"/"office_PBWT4_YBP6D-7wmff_bpwg4_2vgby"/"office pro disk 2"/"BCM"/"Program Files"/"Microsoft Small Business"/"Business Contact Manager"/"SDKComponents"/"PPCRL"/ /home/tfrd/Desktop/filesync/rsync/dir2/  

Usando o Shell Script - ele não está funcionando - os problemas estão na variável dir e na barra ou espaços - e acima de tudo - parece tentar analisar antes do último diretório

Eu tentei a variação com o $ IFS - porque acho que é aqui que estão os problemas de análise.


meu script:

#!/bin/bash
file="/home/tfrd/Desktop/filesync/rsync/test_data_01.txt"

while IFS=$'\n' read -r line
#while IFS= read -r line
#while read line
do

#try 01
#rsync  --include '*.jpg' --include '*.JPG' --exclude '*/*/.' $line /home/rsync/dir2

#try 02
#rsync  --include '*.jpg' --include '*.JPG' --exclude '/*/' $line /home/rsync/dir2

#try 03
#rsync  --include '*.jpg' --include '*.JPG' --exclude '*/*/' $line /home/rsync/dir2

#try 04
rsync --protect-args --include '*.jpg' --include '*.JPG' --exclude '*/*/.' --prune-empty-dirs $line /home/rsync/dir2

done <"$file"



Meus dados de teste: (apenas 2 linhas em um arquivo txt)

/"media"/"tfrd"/"Disk06_01_M"/"Disk02_01_X"/"x_images and camera"/"vernon pics_other"/"office_PBWT4_YBP6D-7wmff_bpwg4_2vgby"/"office pro disk 2"/"BCM"/"Program Files"/"Microsoft Small Business"/"Business Contact Manager"/"SDKComponents"/"PPCRL"/
/"media"/"tfrd"/"Disk06_01_M"/"Disk02_01_X"/"x_images and camera"/"vernon pics_other"/"office_PBWT4_YBP6D-7wmff_bpwg4_2vgby"/"office pro disk 2"/"SBA"/"program files"/"Microsoft Small Business"/"Office Accounting 2008"/"SDKComponents"/"PPCRL"/



Resultado: (limpo para ser legível)

tfrd@Beagle-Ubuntu:~/Desktop/filesync/rsync$ clear


tfrd@Beagle-Ubuntu:~/Desktop/filesync/rsync$ ./script.sh 
/media/tfrd/Disk06_01_M/Disk02_01_X/x_images and camera/vernon pics_other/office_PBWT4_YBP6D-7wmff_bpwg4_2vgby/office pro disk 2/BCM/Program Files/Microsoft Small Business/Business Contact Manager/SDKComponents/PPCRL

rsync: link_stat "/media/tfrd/Disk06_01_M/Disk02_01_X/x_images" failed: No such file or directory (2)
rsync: link_stat "/home/tfrd/Desktop/filesync/rsync/and" failed: No such file or directory (2)
rsync: change_dir "/home/tfrd/Desktop/filesync/rsync//camera" failed: No such file or directory (2)
rsync: change_dir "/home/tfrd/Desktop/filesync/rsync//pics_other/office_PBWT4_YBP6D-7wmff_bpwg4_2vgby" failed: No such file or directory (2)
rsync: link_stat "/home/tfrd/Desktop/filesync/rsync/pro" failed: No such file or directory (2)
rsync: link_stat "/home/tfrd/Desktop/filesync/rsync/disk" failed: No such file or directory (2)
rsync: change_dir "/home/tfrd/Desktop/filesync/rsync//2/BCM" failed: No such file or directory (2)
rsync: change_dir "/home/tfrd/Desktop/filesync/rsync//Files" failed: No such file or directory (2)
rsync: link_stat "/home/tfrd/Desktop/filesync/rsync/Small" failed: No such file or directory (2)
rsync: change_dir "/home/tfrd/Desktop/filesync/rsync//Business" failed: No such file or directory (2)
rsync: link_stat "/home/tfrd/Desktop/filesync/rsync/Contact" failed: No such file or directory (2)
rsync: change_dir "/home/tfrd/Desktop/filesync/rsync//Manager/SDKComponents" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.0]


/media/tfrd/Disk06_01_M/Disk02_01_X/x_images and camera/vernon pics_other/office_PBWT4_YBP6D-7wmff_bpwg4_2vgby/office pro disk 2/SBA/program files/Microsoft Small Business/Office Accounting 2008/SDKComponents/PPCRL

rsync: link_stat "/media/tfrd/Disk06_01_M/Disk02_01_X/x_images" failed: No such file or directory (2)
rsync: link_stat "/home/tfrd/Desktop/filesync/rsync/and" failed: No such file or directory (2)
rsync: change_dir "/home/tfrd/Desktop/filesync/rsync//camera" failed: No such file or directory (2)
rsync: change_dir "/home/tfrd/Desktop/filesync/rsync//pics_other/office_PBWT4_YBP6D-7wmff_bpwg4_2vgby" failed: No such file or directory (2)
rsync: link_stat "/home/tfrd/Desktop/filesync/rsync/pro" failed: No such file or directory (2)
rsync: link_stat "/home/tfrd/Desktop/filesync/rsync/disk" failed: No such file or directory (2)
rsync: change_dir "/home/tfrd/Desktop/filesync/rsync//2/SBA" failed: No such file or directory (2)
rsync: change_dir "/home/tfrd/Desktop/filesync/rsync//files" failed: No such file or directory (2)
rsync: link_stat "/home/tfrd/Desktop/filesync/rsync/Small" failed: No such file or directory (2)
rsync: change_dir "/home/tfrd/Desktop/filesync/rsync//Business" failed: No such file or directory (2)
rsync: link_stat "/home/tfrd/Desktop/filesync/rsync/Accounting" failed: No such file or directory (2)
rsync: change_dir "/home/tfrd/Desktop/filesync/rsync//2008/SDKComponents" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.0]
    
por David 16.12.2017 / 22:35

2 respostas

1

Você não precisa citar todos os elementos de caminho.

No arquivo de texto com a lista de caminhos, será melhor não ter citações, apenas os nomes de arquivos como eles são:

/media/tfrd/Disk06_01_M/Disk02_01_X/x_images and camera/vernon pics_other/office_PBWT4_YBP6D-7wmff_bpwg4_2vgby/office pro disk 2/BCM/Program Files/Microsoft Small Business/Business Contact Manager/SDKComponents/PPCRL/
/media/tfrd/Disk06_01_M/Disk02_01_X/x_images and camera/vernon pics_other/office_PBWT4_YBP6D-7wmff_bpwg4_2vgby/office pro disk 2/SBA/program files/Microsoft Small Business/Office Accounting 2008/SDKComponents/PPCRL/

E escreva o script assim:

#!/bin/bash
file="/home/tfrd/Desktop/filesync/rsync/test_data_01.txt"

while IFS=$'\n' read -r line
do
    rsync --protect-args --include '*.jpg' --include '*.JPG' --exclude '*/*/.' --prune-empty-dirs "$line" /home/rsync/dir2
done < "$file"

É isso. Observe que $line está entre "..." quando usado como o argumento de caminho de rsync . Isso garantirá que todos os espaços incorporados e outros caracteres especiais sejam manipulados corretamente. Todo o conteúdo dentro do "..." é tratado como um único valor, é por isso que funciona.

    
por 16.12.2017 / 22:48
0

Você tinha

while IFS=$'\n' read -r line ; do
    rsync ... $line /some/target/dir
done < inputfile

Com inputfile contendo linhas como esta:

/"media"/"tfrd"/"blah blah"/"yet another dir"/"foo"

Você está no caminho certo, pois usar citações e / ou definir IFS ajudará na divisão de palavras . No entanto, existem alguns problemas.

Primeiro, as citações dentro de uma variável não importam, se a variável é dividida após a expansão, é dividida. Por exemplo. var='"foo bar"'; printf "%s\n" $var imprimirá "foo e bar" em duas linhas separadas (eles foram para printf como dois argumentos). Em vez disso, você precisa citar a variável ao expandi-la, por exemplo, var='foo bar'; printf "%s\n" "$var" .

Em segundo lugar, enquanto o conteúdo de IFS controla a divisão de palavras, você só está configurando-o para a nova linha pela duração do read , não para o restante do script. Isso poupa você de read fazendo qualquer divisão, mas não da divisão após a expansão sem aspas. A configuração de IFS=$'\n'; no início do script também o tornaria efetivo para a expansão, mas ainda é melhor citá-lo (porque evita a globalização também).

Como read tem novas linhas como delimitadores para interromper a leitura, é melhor dar a ela uma IFS vazia, em vez de uma com nova linha.

Então, você provavelmente quer ter

while IFS= read -r line ; do
    rsync ... "$line" /some/target/dir
done < inputfile

com o arquivo de entrada sem citações

/media/tfrd/blah blah/yet another dir/foo
    
por 17.12.2017 / 00:11

Tags