두 번째 위치에 미러링된 디렉터리와 파일을 반복적으로 처리하려고 합니다.
제가 정의한 함수는 다음과 같습니다.
#!/bin/bash
set -e
shopt -s nullglob
shopt -s dotglob
dom() {
echo "Dirs:";
for elem in "$1/*/"; do
if test -d "$elem"; then
echo is Dir # Is never called
fi
echo "$elem"; # intended to be dom "$elem" "$2"
done;
echo "Files:";
for elem in "$1/*"; do # Same issues as above
if test -f "$elem"; then
echo "$elem is File" # is never called
fi
echo do stuff with "$elem" "$2/$elem";
done;
}
dom "$2" "$1";
디렉토리 구조는 다음과 같습니다.
- My Directory With Spaces/Subdir/...
- My Directory With Spaces/Subdir with Spaces/...
- My Directory With Spaces/Files...
- Other Dir/My Directory With Spaces/Subdir/...
- Other Dir/My Directory With Spaces/Subdir with Spaces/...
- Other Dir/My Directory With Spaces/Files...
내가 겪고 있는 문제는 glob이 올바르게 구문 분석되지 않거나 -loop가 for
경로 이름에 공백이 있는 단어를 반복한다는 것입니다. 위의 코드를 사용하면 다음과 같은 결과를 얻습니다.
$ ./script.sh Param1 My\ Directory\ With\ Spaces
Dirs:
My Directory With Spaces/*/
Files:
do stuff with My Directory With Spaces/* Param1/My Directory With Spaces/*
$ ./script.sh Param1 My\ Directory\ With\ Spaces/
Dirs:
My Directory With Spaces//*/
Files:
do stuff with My Directory With Spaces//* Param1/My Directory With Spaces//*
그것은해야한다
$ ./script.sh Param1 My\ Directory\ With\ Spaces
Dirs:
My Directory With Spaces/Subdir/
My Directory With Spaces/Subdir with Spaces/
Files:
do stuff with My Directory With Spaces/Files Param1/My Directory With Spaces/Files
$ ./script.sh Param1 My\ Directory\ With\ Spaces/
Dirs:
My Directory With Spaces/Subdir/
My Directory With Spaces/Subdir with Spaces/
Files:
do stuff with My Directory With Spaces/Files Param1/My Directory With Spaces/Files
테스트는 이전에 처리된 디렉터리를 건너뛰는 것이지만 디버그 에코는 현재 디버깅을 위해 외부에 있습니다.
실제로 질문은 다음과 같습니다. 왜 glob이 예상대로 작동하지 않습니까?
나는 $1/*/
그런 말을 인용하거나 하지 않으려고 노력했지만 ${1// /\\ }/*/
, 그것은 더 이상한 일을 했습니다. 디렉토리를 변경하고 돌아가는 것도 실행 가능한 옵션이 아닙니다.
다음 질문은 도움이 되지 않았습니다.
답변1
현재 겪고 있는 문제는 디렉토리 이름의 공백에서 비롯된 것이 아니라 (아이러니하게도) 적용한 해결 방법, 즉 쉘 변수를 올바르게 인용하는 데서 발생합니다.
적용한 따옴표는 파일 및 디렉터리 이름을 공백으로 지정하는 올바른 방법이지만 따옴표 내에서는 전역 확장이 비활성화됩니다. 이것이 바로 *
디버그 출력에 텍스트가 표시되는 이유입니다(예:이 Q&A).
이 경우 해결책은 와일드카드 부분을 유지하는 것입니다.외부따옴표와 같은
for elem in "$1/"*/; do ... ; done
그리고
for elem in "$1/"*; do ... ; done
아래와 같이 실제로 인용되지 않은 변수 참조의 인용되지 않은 부분에 glob을 "삽입"할 수 있습니다 "$1/"*"/$2 and some static text"
(그러나 이 특별한 경우에는 코드 읽기가 어려워지므로 /
해당 부분을 인용되지 않은 상태로 두었습니다).