rsync - 쉘 스크립트를 사용하여 각 JPG/jpg 파일을 하나의 하드 드라이브에서 단일 디렉토리로 이동합니다.

rsync - 쉘 스크립트를 사용하여 각 JPG/jpg 파일을 하나의 하드 드라이브에서 단일 디렉토리로 이동합니다.

나는 어떤 방향을 찾고 있었습니다. 작동하기는 했지만 아무 것도 없었습니다.

로컬 하드 드라이브가 있고 모든 .JPG 및 .jpg 파일을하나의다른 로컬 하드 드라이브의 디렉터리입니다.

rsync 사용 - 내 생각: (소스 하드 드라이브는 Windows 시스템입니다. 파일 이름에는 공백이 있습니다.)
- 소스 하드 드라이브의 모든 디렉터리 목록을 가져오고 텍스트 파일에 넣습니다.
- 디렉터리 목록 텍스트 파일을 편집하여 모든 디렉터리에 따옴표를 추가합니다.
-- 쉘 스크립트 루프를 사용하여 텍스트 파일의 각 줄에서 rsync를 실행합니다.



명령줄에서 rysnc를 사용하고 디렉터리를 개별적으로 복사하면 작동합니다.

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/  

쉘 스크립트 사용 - 작동하지 않습니다. 문제는 dir 변수와 슬래시 또는 공백에 있습니다. 가장 중요한 것은 마지막 디렉토리 이전에 구문 분석을 시도하는 것 같습니다.

나는 $IFS의 변형을 시도했습니다. 그것이 구문 분석 문제라고 생각했기 때문입니다.


내 스크립트:

#!/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"



내 테스트 데이터: (txt 파일에 단 2줄만)

/"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"/



결과: (청소 후 읽을 수 있음)

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]

답변1

모든 경로 요소를 인용할 필요는 없습니다.

경로 목록이 포함된 텍스트 파일에서는 따옴표를 사용하지 않고 파일 이름만 사용하는 것이 좋습니다.

/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/

그런 다음 다음과 같이 스크립트를 작성하십시오.

#!/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"

그게 다야. 경로 매개변수로 사용되는 경우에는 $line가 포함됩니다. 이렇게 하면 포함된 공백과 기타 특수 문자가 올바르게 처리됩니다. 내부의 모든 것이 단일 값으로 처리되므로 작동합니다."..."rsync"..."

답변2

넌 해본 적 있니

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

다음과 같은 줄을 포함합니다 inputfile.

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

IFS견적 및/또는 설정을 사용하면 예방에 도움이 되므로 어느 정도 올바른 방향으로 가고 있습니다.분사. 그러나 몇 가지 문제가 있습니다.

첫째, 변수 내부의 따옴표는 전혀 중요하지 않습니다. 변수가 확장 후 분할되면 분할됩니다. 예를 들어 및 는 var='"foo bar"'; printf "%s\n" $var두 개의 개별 라인에 인쇄됩니다 (두 개의 인수로 사용 ). 대신 확장할 때 변수를 참조해야 합니다(예: ) ."foobar"printfvar='foo bar'; printf "%s\n" "$var"

둘째, 단어 분할의 내용을 제어할 때 스크립트의 나머지 부분이 아닌 IFS기간 동안 개행 문자로만 설정합니다 . 이렇게 하면 분할을 수행할 read필요가 없지만 따옴표가 없는 확장 후에는 분할할 필요가 없습니다. read스크립트 시작 부분에 설정하면 IFS=$'\n';확장에도 유효하지만 인용하는 것이 더 좋습니다(와일드카드도 방지하므로).

개행 문자는 읽기를 중지하는 구분 기호로 사용 되므로 개행 문자가 포함된 구분 기호 대신 read빈 문자를 제공하는 것이 좋습니다 .IFS

그래서 당신은 원할 수도 있습니다

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

입력 파일에 따옴표가 포함되어 있지 않습니다.

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

관련 정보