2011-12-30 1 views
33

파일 이름에 포함 할 수있는 문자를 신경 쓰지 않고 파일 목록을 반복하면서 null 문자로 구분 된 목록을 사용합니다. 이 코드는 더 잘 설명 할 것입니다. 파일에서 읽을 때Bash 루프를 통해 널로 구분 된 문자열 읽기.

# Set IFS to the null character to hopefully change the for..in 
# delimiter from the space character (sadly does not appear to work). 
IFS=$'\0' 

# Get null delimited list of files 
filelist="`find /some/path -type f -print0`" 

# Iterate through list of files 
for file in $filelist ; do 
    # Arbitrary operations on $file here 
done 

다음 코드는 작동하지만 변수가 포함 텍스트에서 읽을 필요가있다. 배쉬에서

while read -d $'\0' line ; do 
    # Code here 
done < /path/to/inputfile 
+1

bash 변수에 null 문자를 저장할 수 없다고 생각합니다. 적어도, 나는 그것을 할 방법을 찾지 못했습니다 ... –

답변

53

당신은 IFS= 인라인 그냥 -d ''를 사용하지만, 'D'와 하나의 첫 번째 사이에 공백이 있는지 확인해야 여기에 문자열

while IFS= read -r -d '' line ; do 
    # Code here 
done <<<"$var" 

주를 사용할 수 있습니다 -인용문. 또한, 이스케이프 무시하려면 -r 플래그를 추가하십시오.

또한 질문의 일부는 아니지만 find을 사용할 때 스크립트를 수행하는 더 좋은 방법을 제안 할 수 있습니다. 프로세스 대체를 사용합니다.

while IFS= read -r -d '' file; do 
    # Arbitrary operations on "$file" here 
done < <(find /some/path -type f -print0) 
+0

우수, 정확히 내가 무엇을 찾고 있었는지. 감사! 나는 두 번째 예를 사용하여 끝내었다. – Matthew

+0

-d 플래그가 설정되어 있으므로 IFS를 어떻게 사용합니까? – thisirs

+4

@thisirs'IFS'를 널 문자열로 설정함으로써 앞뒤의 공백 문자가 보존됩니다. – toxalot

관련 문제