2012-04-29 5 views
4

md5deep이 확인하기 위해 .hash로 끝나는 모든 파일을 추가하는 스크립트를 만들려고합니다. 이름에 공백이있는 파일은이 스크립트를 어기는 것 같습니다. 내가 "O S.hash"라는 파일과 스크립트를 실행할 때마다 내가 md5deep이 같은 입력을 상호 침투합니다 XVAR="$XVAR -x $f "bash 스크립트에서 이스케이프 처리하기

XVAR="$XVAR -x \'$f\' "에 또는 XVAR="$XVAR -x \"$f\" " 변경하는 경우

O: No such file or directory 

을 얻을 것

#!/bin/bash 
XVAR="" 
for f in *.hash 
do 
    XVAR="$XVAR -x $f " 
done 
md5deep -e $XVAR -r * 

O 대신

"O: No such file or directory 

e 스크립트의 변수 쵸는 스크립트에서 명령이 깰 것 같으면 같은 md5deep -e -x "O S.hash" -r * 작동하지만

답변

3

이 가장 좋은 해결책이 아니다 XVAR -x 'O S.hash' 또는 -x "O S.hash"

쉘에서 명령의 수동 입력을 보여줍니다 하지만 작동 보인다 : 팀 Pote과 요나단 레플러에 의해 제안

find . -name '*.hash' -printf "-x\0%p\0" | xargs -0 md5deep -r * -e 

이 실제로 영업 이익은 원하는대로 동일하지 않습니다를, 그래서 여기에 수정이다 :

find . -maxdepth 1 -name '*.hash' -printf "-x\0%p\0" | xargs -0 md5deep -r * -e 
+0

'.hash' 파일을 포함하는 하위 디렉토리가있는 경우 명령 행에 불필요한 파일이 표시됩니다. –

+0

그냥'-maxdepth 1'을 추가하십시오. –

+0

완벽하게 작동합니다 : – anselm

2

이제는 Unix 시스템의 사람들이 일반적으로 파일 이름에 공백이있는 파일 이름 (및 디렉토리 이름)을 피하는 이유를 알고 있습니다. — 그런 이름을 처리하도록 쉘을 프로그램해야하는 것은 귀찮은 일입니다. 쉘은 이러한 이름이없는 시스템에서 사용하도록 설계되었습니다. 뉴 라인은 또한 많은 슬픔을 불러 일으 킵니다.

bash을 사용하는 경우 가장 좋은 방법은 배열을 사용하여 요소를 보유한 다음 "${array[@]}"을 나열하는 것입니다. 거의 간단하다 :

declare -a XVAR 

for file in *.hash 
do 
    XVAR+=("-x" "$file") 
done 

md5deep -e "${XVAR[@]}" -r * 

(Gordon Davisson 언급 어레이 확장 표기 악용 참조 섹션 bash 레퍼런스 매뉴얼 §6.7 '배열'(배열에게 많은 정보 배시 4.1);는 섹션 참조. §3.4 += 연산자의 쉘 매개 변수.

어떤 이유로 어레이를 사용할 수 없으면 쉘이 일을 왜곡하지 않도록 인수를 이스케이프하는 프로그램이 필요합니다. 이 사용하기 까다 롭다는 평가와 함께

XVAR= 
for file in *.hash 
do 
    name=$(escape "$file") 
    XVAR="$XVAR -x $file" 
done 
eval md5deep -e $XVAR -r * 

; 나는 그런 프로그램 escape을 불렀다 그것은 작동하지만 배열을 사용합니다.

+1

다음은 배열에 항목을 추가하는 간단한 방법입니다 :'XVAR + = (- x "$ file")' –

+0

Ah; 감사합니다, @ GordonDavisson; 나는 내가 무엇인가를 멀리 바라보아야 한다라는 것을 알고 있었다. 그러나 나는 무엇이 확실하지 않았다! Bash (4.1) 참조 매뉴얼의 Arrays 섹션 (§6.7)은'+ ='; '+ ='를 찾을 필요가 있다는 것을 알게되면, §3.4에서 언급 한 표기법을 찾을 수 있으며 배열에 대한 동작도 거기에서 언급됩니다. –

관련 문제