텍스트 파일에 나열된 파일을 디렉터리에 복사하려고 합니다. 예를 들면 다음과 같습니다.
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"
IFS
null로 설정하면 분할이 수행되지 않으며 -r
bash에 백슬래시 문자를 이스케이프하도록 지시합니다.