여러 공백을 사용하는 파이프 내용

여러 공백을 사용하는 파이프 내용

텍스트 파일에 나열된 파일을 디렉터리에 복사하려고 합니다. 예를 들면 다음과 같습니다.

cat files.txt | xargs  -I{} cp "{}" ~/Desktop/temp

그런데 일부 파일을 복사할 수 없는 것으로 나타났습니다. 복사할 수 없는 파일 이름에는 "My Document.pdf"와 같이 이중 공백이 포함되어 있습니다.

나는 몇 가지 테스트를 수행했으며 단순히 에코를 파이핑하면 공백 중 하나만 제외하고 모두 제거됩니다. 예를 들어:

echo "Hello         World" | xargs echo

그냥 돌아오세요

안녕하세요 세계

파이핑하는 동안 콘텐츠의 기존 공백을 유지하도록 지시하는 방법이 있습니까?

답변1

xargs불행하게도 입력 내용을 많이 분석하고 파일 이름에 있는 문자(공백, 따옴표/아포스트로피, 백슬래시, 탭 등)에 따라 여러 가지 방법으로 파일을 손상시킬 수 있습니다. 파일 이름을 처리하는 가장 좋은 방법은 빈 목록으로 구분하여 사용하는 것입니다 xargs -0(이렇게 하면 모든 구문 분석이 꺼집니다). 파일 목록이 에서 생성된 경우 find이 작업은 쉽습니다(만 사용 -print0) . Perl 스크립트의 출력을 처리하고 있으므로 두 가지 옵션이 있습니다. 줄 바꿈 대신 null 값을 출력하도록 Perl 스크립트를 수정하거나, 그렇게 할 수 없는 경우 다음을 사용하여 파이프라인에서 변환하는 것입니다 tr.

cat files.txt | tr "\n" "\0" | xargs -0 -I{} cp "{}" ~/Desktop/temp

답변2

OS X에서 공백을 백슬래시로 바꾸고 공백을 바꿔야 하는 솔루션을 찾았습니다. 이것이 내가 생각해낸 것입니다:

echo "Hello        World" | sed 's/ /\\ /g' | xargs echo

이렇게 하면 모든 공간이 보존됩니다.

답변3

while루프를 사용할 수 있습니다 .

while IFS= read -r _file
do
    cp "$_file" ~/Desktop/temp
done < "files.txt"

IFSnull로 설정하면 분할이 수행되지 않으며 -rbash에 백슬래시 문자를 이스케이프하도록 지시합니다.

관련 정보