쉘 스크립트를 통해 "파일"과 "공백이 있는 디렉토리 이름" 분할

쉘 스크립트를 통해 "파일"과 "공백이 있는 디렉토리 이름" 분할

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

  1. for루프 반복성격선이 아닌
  2. 항상 귀하의 의견을 인용하십시오 "$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이 변수를 일시적으로 변경해야 합니다.

관련 정보