파일 이름을 사용하여 파일의 절대 위치를 나열하고 다른 위치에 복사하는 작은 스크립트를 만들려고 합니다.
파일 콘텐츠 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
함께 루프를 사용하십시오 .read
for
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
(복사할 파일 수가 많은 경우 매개변수 크기 제한을 해결하는 데에도 유용합니다.)