xargs, -exec를 찾게 된 이유

경로나 파일 이름에 띄어쓰기가 존재할때

특정 폴더 내에서 @eadir라는 폴더들을 전부 제거하려했습니다.
처음에 제가 시도한 것은 이 명령이었습니다.

rm -rf $( find ./ -name "@eadir" -type d )

하지만 이 명령에서는 경로 상에 띄어쓰기가 있을 때입니다.

만약 find ./ -name "@eadir" -type d의 결과가 아래와 같다면 오류가 발생합니다.

#find ./ -name "@eadir" -type d
./direc tory/@eadir
./dir/@eadir
#rm -rf $( find ./ -name "@eadir" -type d )
rm: ./direc: No such file or directory
rm: tory/@eadir: No such file or directory

분명 두 줄이지만 띄어쓰기를 기준으로 3개로 나뉘어 ./direc tory/@eadir은 삭제가 이루어지지 않고, ./dir/@eadir은 삭제가 됩니다.

argument list too long

저는 띄어쓰기 때문에 찾아보았으나 위 명령은 arguments 갯수 제한도 있다고 합니다.
그래서 argument가 너무 많은 경우 argument list too long를 보게 되는데, 이 때도 xargs와 exec를 사용합니다.

-exec

find ./ -name "@eadir" -type d -exec rm -rf {} \;

이 때 는 find의 결과가 들어갈 공간이고, \;는 명령을 수행하라는 코드입니다.
-exec 의 종료 부분이라고 보면 될 것 같습니다.

xargs

xargs는 exec와 비슷하지만 find에만 국한되지도 않고, 를 다른 문자로 바꿀수도 있습니다.
먼저 -exec에서 사용한 코드를 xargs로 나타내면 아래와 같습니다.

find ./ -name "@eadir" -type -d | xargs rm -rf {}

파이프를 이용하며, \;는 없어도 됩니다.

xargs의 경우 를 다른 것으로 바꿀수 있습니다.
find ./ -name "@eadir" -type -d | xargs -i ASDF rm -rf ASDF
파이프만 있다면 find가 아니여도 가능합니다.
#text.txt 파일 안에 적힌 파일을 검색하고 삭제하기
cat text.txt | xargs find ./ -name  | xargs rm -r 

xargs는 정말 활용도가 많은것 같습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다


Ads Blocker Image Powered by Code Help Pro

광고 차단 감지됨!

닫기를 누르면 이용하실 수 있지만, 광고 차단은 해제해주시면 좋겠습니다.
Powered By
Best Wordpress Adblock Detecting Plugin | CHP Adblock