공백이 있는 파일 목록을 복사하는 쉘 스크립트

공백이 있는 파일 목록을 복사하는 쉘 스크립트

파일 이름을 사용하여 파일의 절대 위치를 나열하고 다른 위치에 복사하는 작은 스크립트를 만들려고 합니다.

파일 콘텐츠 test.txt예:

/home/public/Music/Disk/GameOfThrones/Season1/01 Main Title.mp3

시도해 볼 스크립트:

for file in `cat test.txt`; do cp "$file" temp ; done

그러나 스크립트는 세 개의 파일이 있다고 생각합니다. 더 많은 검색 결과 다음 문서가 나왔습니다.

OIFS="$IFS"
IFS=$'\n'
for file in `cat test.txt`; do cp "$file" temp ; done
IFS="$OIFS"

이는 문자 "n"의 모든 발생을 개행 문자로 바꾸는 것으로 보입니다.

그렇다면 올바르게 수행하는 방법은 무엇입니까?

답변1

다음이 아닌 와 while함께 루프를 사용하십시오 .readfor

while read -r file ; do
    cp "$file" temp
done < test.txt

답변2

분할+글로브 연산자( `...`또는 새로운 형식)는 인용되지 않습니다.$(...)

분할 부분은 $IFS기본적으로 SPC, TAB 및 개행 문자로 분할됩니다. 여기서는 전역 부분이 아닌 개행 문자로만 분할하려고 합니다. 그래서 이것은:

IFS='
' # split on newline only. IFS=$'\n' also works in some shells
set -o noglob # disable the glob part
cp -- $(cat test.txt) temp/

zsh명시적인 분할 연산자가 있으므로 이는 다음과 같이 단순화됩니다 .

cp -- ${(f)"$(cat test.txt)"} temp/

GNU 도구를 사용하면 다음 작업도 수행할 수 있습니다.

xargs -d '\n' -ra test.txt cp -t temp

(복사할 파일 수가 많은 경우 매개변수 크기 제한을 해결하는 데에도 유용합니다.)

관련 정보