bash script2023. 8. 10. 21:02

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/600926

간단한 내용이지만 간혹 잊어버리고 있다가 오류가 발생하는 상황이 있어서 여기에 정리해 두기로.

우선 xargs 명령에 대한 기본적인 내용은 이전 게시물을 참고하자. 여기로

 

예를 들어 앞 명령어의 출력이 파일명인데 이것을 xargs 명령을 통해서 인자(argument)로 넘기고자 하는 상황을 생각해 보자. 확장자가 txt인 파일만 grep으로 추려낸 후 cat으로 내용을 확인하는 경우다. 통상 아래와 같이 입력하면 될 것이다.

# 현재 디렉토리에 있는 txt 파일의 내용 확인
ls | grep "\.txt" | xargs cat

만약 위와 같이 입력했는데 txt 파일 중에 파일명에 공백이 포함된 것이 있다면 해당 파일에 대해서는 cat 명령이 제대로 실행되지 않고 오류 메세지가 나올 것이다. 공백 때문에 하나의 파일을 지칭하는 문자열이 공백을 기준으로 나누어지기 때문이다.

예를 들어 파일명이 "names and phones.txt"라면, cat 명령어에서는 "names", "and", "phones.txt" 이렇게 3개의 인자가 넘어온 것으로 해석되어 3개의 각기 다른 파일을 열어서 내용을 출력하려 한다. 존재하지 않는 파일을 읽으려 하므로 당연히 오류 발생.

해결책은 간단하다. xargs에서 -i 옵션을 이용해면 된다. -i 옵션으로 인자의 위치를 명시적으로 지정해 주면 공백이 포함된 출력이라도 하나의 인자로 해석되므로 실행에 문제가 없다.

# 현재 디렉토리에 있는 txt 파일의 내용 확인(공백이 포함된 파일명도 가능)
ls | grep "\.txt" | xargs -i cat {}

출력에 공백이 포함되지 않았다는 확신이 없을 때는 그냥 -i 옵션을 붙여 주는 것이 안전하다.

 

728x90
Posted by 반달가면