find 명령어를 사용하다 보면 파이프라인이 작동하지 않는 경우가 있다.
파이프라인 (|)은 전 명령어의 stdout (표준출력)을
다음 명령어의 stdin (표준입력)으로 바꿔주는 역할을 한다.
예를 들어서
1. find와 rm 조합
find -name . directory1 | rm
-> X
rm 명령어는 stdin을 무시하는 명령어이다.
이런 경우 xargs 명령어를 사용하면 해결이 된다.
xargs 명령어는 stdout을 arguments(인자)로 전달해 명령을 실행한다.
또한 여러가지 옵션을 더해서 사용할 수도 있다. ( man xargs 로 확인 )
find -name . directory1 | xargs rm
혹은
find -name . directory1 -exec rm {} \;
이렇게 쓸 수 있다.
이때 rm 뒤의 기호들은
{} : find의 결과 파일들을 의미한다.
\; : 각각의 결과에 대해 명령어를 실행하고 -exec을 끝냄을 의미한다.
2. find와 cp 조합
directory1 에서 파일을 찾아 directory2로 복사시킨다고 생각해보자.
find -name . directory1 | cp directory2
-> X
위의 rm 명령어와 같이
find -name . directory1 | xargs -I{} cp {} directory2
혹은
find -name . directory1 -exec cp {} directory \;
cp 명령어의 syntax는 아래와 같다.
cp [option] [filename] [directory]
-I[기본값] 옵션은 인자가 들어갈 위치를 정해준다.
cp명령어의 경우 option과 목적지 directory 사이가 맞는 위치이다.
find -name . filename -exec cp directory {} \;
-> X
{}의 위치가 틀려서 복사할 파일이 정해지지 않았으므로 오류가 뜬다.
{}는 find의 결과 파일들을 의미하기 때문에
목적지 디렉토리의 앞에 써야한다.
xargs 명령어 참고 자료:
man page: http://man7.org/linux/man-pages/man1/xargs.1.html
KLDP의 질문:
'Computer Science > [19-상] Linux Bash Script' 카테고리의 다른 글
[Linux_bash] \(back slash, escape character)의 의미 (0) | 2020.03.03 |
---|---|
[Linux_bash] regex,vi: 큰 수를 영어 숫자 단위(B,M,K)로 변경하기 (0) | 2020.02.29 |
[Linux_bash] regex: 정규표현식 그룹(captured group) 이용하기 (0) | 2020.02.29 |
[Linux_bash] pr,sed,grep: 문서 양식화하고 여백 지우기 (0) | 2020.02.29 |
[Linux_bash] redirection 이해하기 (0) | 2020.02.20 |
댓글