Files.txt
다음 내용이 포함된 파일이 있습니다 .
TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files/AppDelegate.m
아래와 같이 파일 및 디렉터리 이름을 추출하여 다른 프로세스에 전달합니다.
files=$(cat Files.txt)
for item in $files ; do
dn=$(dirname $item)
printf $item
printf "\n"
printf $dn
printf "\n\n"
# passing to another process
done
그러나 이로 인해 다음이 남습니다.
TestApp/Resources/Supporting
TestApp/Resources
Files/main.m
Files
TestApp/Resources/Supporting
TestApp/Resources
Files/AppDelegate.h
Files
TestApp/Resources/Supporting
TestApp/Resources
Files/AppDelegate.m
Files
나에게 필요한 것은 이것이다:
TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files
TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files
TestApp/Resources/Supporting Files/AppDelegate.m
TestApp/Resources/Supporting Files
\
다음과 같이 공백 접두사를 추가해 보았습니다 Files.txt
.
TestApp/Resources/Supporting\ Files/main.m
그리고 %20
다음과 같이:
TestApp/Resources/Supporting%20Files/main.m
불운!
답변1
for
루프 반복성격선이 아닌- 항상 귀하의 의견을 인용하십시오
"$variables"
(언제 인용하지 말아야 할지 정확히 알지 않는 한).
while read -r item ; do
dn=$(dirname "$item")
printf "%s\n" "$item"
printf "%s\n" "$dn"
# pass "$item" and "$dn" to another process
done < Files.txt
답변2
필드 구분 기호를 설정해야 합니다.
OIFS=$IFS
IFS=$'\n'
files=$(cat Files.txt)
for item in $files ; do
dn=$(dirname $item)
printf $item
printf "\n"
printf $dn
printf "\n\n"
# passing to another process
done
IFS=$OIFS
산출:
[me@localhost test]$ ./test.sh
TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files
TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files
TestApp/Resources/Supporting Files/AppDelegate.m
TestApp/Resources/Supporting Files
설명하다: http://en.wikipedia.org/wiki/Internal_field_separator
이 $IFS
변수는 입력이 토큰으로 분할되는 방식을 정의하며 기본적으로 공백, 탭 및 줄 바꿈이 사용됩니다. 줄 바꿈으로만 분할하려고 하므로 $IFS
이 변수를 일시적으로 변경해야 합니다.