그건 $(cat file_list.txt)
같은 POSIX 쉘에서 bash
리스트 문맥에서 분할 + 글로브 연산자는 ( zsh
단지 않습니다 분할 예상대로 부분).
글 로빙을 해제하지 않으면 $IFS
(기본적으로 SPC , TAB 및 NL) 문자로 분할되고 글로브를 수행하지 않습니다.
여기서는 개행으로 만 나누고 glob 부분을 원하지 않으므로 다음과 같아야합니다.
IFS='
' # split on newline only
set -o noglob # disable globbing
for file in $(cat file_list.txt); do # split+glob
mv -- "$file" "new_place/$file"
done
그것은 또한 while read
빈 줄을 버리고, 끝나지 않은 끝없는 줄을 보존하고, mv
stdin (예를 들어 프롬프트의 경우에 필요 )을 유지하는 이점 ( 루프보다)을 가지고 있습니다.
이 파일의 전체 내용 (같은 껍질을 여러 번 메모리에 저장하는 것을 불구하고 단점을 가지고 bash
하고 zsh
).
일부 쉘 (로 ksh
, zsh
그리고 낮은 정도 bash
), 당신은 그것을 최적화 할 수 있습니다 $(<file_list.txt)
대신 $(cat file_list.txt)
.
while read
루프 와 동등한 작업을 수행하려면 다음이 필요합니다.
while IFS= read <&3 -r file || [ -n "$file" ]; do
{
[ -n "$file" ] || mv -- "$file" "new_place/$file"
} 3<&-
done 3< file_list.txt
또는과 bash
:
readarray -t files < file_list.txt &&
for file in "${files[@]}"
[ -n "$file" ] || mv -- "$file" "new_place/$file"
done
또는과 zsh
:
for file in ${(f)"$(<file_list.txt)"}
mv -- "$file" "new_place/$file"
done
또는 GNU mv
와 함께 zsh
:
mv -t -- new_place ${(f)"$(<file_list.txt)"}
또는 GNU mv
및 GNU xargs
및 ksh / zsh / bash를 사용하십시오.
xargs -rd '\n' -a <(grep . file_list.txt) mv -t -- new_place
bash / POSIX 쉘에서 변수를 인용하는 것을 잊어 버린 보안 함의 에서 확장을 인용하지 않은 것이 의미하는 것에 대한 자세한 내용