특정 디렉토리의 모든 하위 디렉토리 (파일 제외)를 반복하는 bash 쉘 스크립트가 있습니다. 문제는 일부 디렉토리 이름에 공백이 있다는 것입니다.
내 테스트 디렉토리의 내용은 다음과 같습니다.
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
그리고 디렉토리를 반복하는 코드 :
for f in `find test/* -type d`; do
echo $f
done
출력은 다음과 같습니다.
테스트 / 볼티모어 테스트 / 체리 언덕 테스트 / 에디슨 테스트 / 신규 요크 시티 test / 필라델피아
Cherry Hill과 New York City는 2 ~ 3 개의 개별 항목으로 처리됩니다.
다음과 같이 파일 이름을 인용 해 보았습니다.
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
그러나 소용이 없습니다.
이것을하기위한 간단한 방법이 있어야합니다.
아래 답변은 훌륭합니다. 그러나 이것을 더 복잡하게 만들기 위해-나는 항상 내 테스트 디렉토리에 나열된 디렉토리를 사용하고 싶지는 않습니다. 때로는 디렉토리 이름을 명령 줄 매개 변수로 대신 전달하고 싶습니다.
IFS 설정에 대한 Charles의 제안을 받아 들여 다음을 생각해 냈습니다.
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
그리고 이것은 명령 줄 인수에 공백이 없으면 잘 작동합니다 (해당 인수가 인용 된 경우에도). 예를 들어 test.sh "Cherry Hill" "New York City"
다음과 같은 스크립트를 호출 하면 다음과 같은 출력 이 생성됩니다.
체리 언덕 새로운 요크 시티
list="$@"
원래 값의 목록 성을 완전히 버리고 문자열로 축소합니다. 내 대답의 관행 을 주어진대로 정확하게 따르십시오. 그러한 임무는 그 안에있는 어느 곳에서도 권장되지 않습니다. 프로그램에 명령 줄 인수 목록을 전달하려면 해당 인수를 배열로 수집하고 해당 배열을 직접 확장해야합니다.