입력 목록을 기준으로 파일 복사, 파일 이름에 특수 문자 포함

입력 목록을 기준으로 파일 복사, 파일 이름에 특수 문자 포함

이것은 질문을 바탕으로 한 것입니다.여기.

질문:

  • 폴더에 복사하려는 파일 이름이 나열된 .txt 파일이 있습니다.새 폴더셸(Mac 터미널)에서.

방법, 어디파일목록.txt복사하려는 파일 이름이 포함되어 있습니다(\n으로 구분).

# version 1
for file in $(cat filelist.txt); do cp "$file" newfolder; done

실수:

파일 이름이 있으면파일목록.txt대시, 공백 등이 포함된 이름은 구분되어 있으며 No such file오류가 올바르게 발생합니다.

문제를 해결하려고 시도한 방법은 다음과 같습니다(변수에 dbl 따옴표 추가).

# version 2
for file in "$(cat filelist.txt)"; do cp "$file" newfolder; done

그러나 이것은 공백 구분 없이 모든 파일 이름을 인쇄하고 아무것도 복사하지 않습니다.

질문:

  • echo위에서 언급한 대로 따옴표를 추가하면 이름 분할 문제가 해결됩니다. 예를 들어 cp;

  • cat및 를 사용하여 이 작업을 수행하는 올바른 방법은 무엇입니까 cp? 위에 링크된 답변의 의견은 다음을 나타냅니다.

    set -f;IFS=$'\n'

문제가 해결되었지만 그것이 무엇인지 모르겠습니다.

어떤 조언이라도 대단히 감사하겠습니다!

답변1

여기에는 여러 가지 옵션이 있습니다.

cat filelist.txt | while read file; do
    cp "$file" newfolder
done

그렇다면 우선 왜

for file in $(cat filelist.txt); do cp "$file" newfolder; done

아니요? 파일 목록에 다음이 포함되어 있다고 가정합니다.

a
b c

$(cat filelist.txt)파일 이름 목록을 생성합니다 . for 루프의 출력은 다음 cat과 같이 보고 해석됩니다.

for file in a b c ; do

이것은 분명히 의도가 아닙니다.

입력 필드 구분 기호에 대한 참고 사항이 도움이 되는 부분입니다. 일반적으로 IFS는 공백이므로 파일 이름의 공백은 파일 이름 사이의 구분 기호로 해석됩니다. IFS가 명시적으로 개행으로 설정된 경우 공백은 더 이상 구분 기호로 간주되지 않습니다.

for file in "$(cat filelist.txt)"; do cp "$file" newfolder; done

for 루프에 대한 단일 매개변수를 만듭니다. 결과는 다음과 같습니다.

for file in "a b c" ; do

따라서 루프는 한 번만 실행되며 파일 이름이 존재하지 않습니다.

관련 정보