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는 정말 활용도가 많은것 같습니다.
답글 남기기