sed와 함께 사용하기 위해 bash 스크립트에서 슬래시를 올바르게 이스케이프 처리


14

드라이 모드에서 rsync를 실행 한 다음 rsync 출력에 나열된 파일의 크기를 합산하여 두 폴더를 동기화 할 때 새로 복사 할 파일의 크기를 결정하려고합니다.

현재 부모 폴더로 파일 앞에 접두사를 붙이고 있습니다. sed를 사용하여 줄을 접두사로 쓰는 방법과 sed를 사용하여 탈출하는 방법을 찾았지만 두 가지를 결합하는 데 문제가 있습니다.

이것이 내가 얻은 거리입니다.

source="/my/source/folder/"
target="/my/target/folder/"
escaped=`echo "$source" | sed -e 's/[\/&]/\\//g'`
du `rsync -ahnv $source $target | tail -n +2 | head -n -3 | sed "s/^/$escaped/"` | awk '{i+=$1} END {print i}'

이것은 bash -x myscript.sh에서 얻은 결과입니다.

+ source=/my/source/folder/
+ target=/my/target/folder
++ echo /my/source/folder/
++ sed -e 's/[\/&]/\//g'
+ escaped=/my/source/folder/
+ awk '{i+=$1} END {print i}'
++ rsync -ahnv /my/source/folder/ /my/target/folder/
++ sed 's/^//my/source/folder//'
++ head -n -3
++ tail -n +2
sed: -e expression #1, char 8: unknown option to `s'
+ du
80268

제대로 탈출하는 방법에 대한 아이디어는 높이 평가할 것입니다.

답변:


28

실제로 이스케이프 처리를 신경 쓰지 않아도됩니다 /. 로부터 GNU의 sed사용 설명서 :

/문자가 균일하게 주어진 내 다른 단일 문자로 대체 될 수있다 s명령.

예를 들면 다음과 같습니다.

echo 'foobar' | sed -e 's#foo#bar#'

출력을 준다

barbar

4
이것은 sed 맨 페이지의 첫 번째 것입니다
Clearer

'any'와 같이 *?
Ujjwal Singh

0

데이터를 집계하려는 경우 가능한 하위 디렉토리를 건너 뛰고 싶을 것입니다. 적용 할 수는 없지만 항상 이상을 피하는 것이 가장 좋습니다. 여기 내 소스 디렉토리가 있습니다. 이 파일들은 모두 터치로 만들어 졌으므로 0 공간을 차지합니다.

$ find source
source
source/5832
source/5832/5832_1.png
source/5832/5832_2.png
source/5831
source/5831/5831_1.png
source/5830
source/5830/5830_3.png
source/5830/5830_1.png
source/5830/5830_2.png

당신이하고있는 것만 큼 가까이 탈출 할 필요는 없습니다. 여기에있는 sed 블록은 다음을 수행합니다.
1d; '증분 파일 목록 전송'의 첫 번째 행을 삭제합니다.
/ ^ $ /, $ d; 파일 목록의 끝과 그 이후의 모든 항목을 나타내는 빈 줄을 삭제하십시오.
// $ / d '/'로 끝나는 행은 디렉토리가
됩니다. 백 슬래시로 슬래시를 이스케이프 처리 할 수 ​​있습니다 (실제 질문에 답하기 위해).

$ du $(rsync -ahnv source target | sed '1d;/^$/,$d;/\/$/d')
0   source/5830/5830_1.png
0   source/5830/5830_2.png
0   source/5830/5830_3.png
0   source/5831/5831_1.png
0   source/5832/5832_1.png
0   source/5832/5832_2.png

추가 보너스 포인트의 경우 결과를 집계 할 수도 있습니다.

$ du -s $(rsync -ahnv source target | sed '1d;/^$/,$d;/\/$/d') | awk '{x+=$1;print $0} END {print "sum: "x}'
0   source/5830/5830_1.png
0   source/5830/5830_2.png
0   source/5830/5830_3.png
0   source/5831/5831_1.png
0   source/5832/5832_1.png
0   source/5832/5832_2.png
sum: 0

디렉토리가 완전히 동기화 된 상태 에서이 작업을 수행하면 재미있는 결과가 반환됩니다.

76  .
sum: 76
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.