Bourne 쉘을 사용하고 있습니다.#!/bin/sh
특정 패턴과 일치하는 파일을 찾고 명령이 실행될 때 각 출력을 새 디렉터리에 복사하는 스크립트를 작성 중입니다.
myscript.sh
#!/bin/sh
ssh user@hostname find /path/to/find/file* -mtime 10 | while read -r LINE
do
scp -r user@hostname:$LINE /path/to/destination/
done
다음은 동일한 파일 이름 패턴을 가지고 있지만 그렇지 않은 다른 파일도 있는 파일을 찾기 위한 초기 스크립트입니다. 그래서 grep을 사용하고 파이프를 사용하여 찾기로 결정했지만 더 이상 읽지 않고 ssh
대신 현재 디렉토리에서 분명히 존재하지 않는 파일을 찾습니다.
예는 다음과 같습니다.
ssh user@hostname find /path/to/find/* -mtime 10 | xargs zgrep -il 'pattern_to_find' | while read -r LINE
do
scp -r user@hostname:$LINE /path/to/destination/
done
이 명령을 사용하고 싶었지만 find /path/to/find/* -mtime 10 | xargs zgrep -il 'pattern_to_find'
한동안 함께 사용하면 |
더 이상 작동하지 않습니다.
답변1
find
파이프 와 함께 사용 하지 마십시오 xargs
. 이렇게 하려면 파일 이름 구분 기호로 새 줄 대신 null 문자를 사용하려면 with find -print0
및 to를 사용해 보십시오.xargs -0
에서 man find
:
-0을 인쇄하세요.
True이면 표준 출력에 전체 파일 이름을 인쇄하고 그 뒤에 널 문자(-print에서 사용하는 개행 문자 대신)를 인쇄합니다. 이를 통해 find 출력을 처리하는 프로그램이 개행 또는 기타 유형의 공백이 포함된 파일 이름을 올바르게 해석할 수 있습니다. 이 옵션은 xargs의 -0 옵션에 해당합니다.
따라서 귀하의 명령은 다음과 같습니다.
ssh user@hostname find /path/to/find/ -type f -mtime 10 -print0 | xargs -0 zgrep -il 'pattern_to_find'
하지만 -print0
(제 기억이 맞다면) POSIX는 아닙니다. 따라서 방법은 한 가지뿐입니다. 아래를 읽어보세요.
또는 파이프를 사용하지 않고 명령 옵션을 사용하는 가장 좋은 방법은 다음과 같습니다 -exec
.find
xargs
ssh user@hostname find /path/to/find/ -type f -mtime 10 -exec grep -il 'set' {} + ;
답변2
ssh -n user@hostname 'find /root/git/ -mtime 10 | while read -r LINE ; do echo $LINE; done'
-N옵션은 다음과 같습니다 man ssh
.
-N/dev/null에서 표준 입력을 리디렉션합니다(실제로 표준 입력에서 읽는 것을 방지합니다). 이 옵션은 ssh가 백그라운드에서 실행 중일 때 사용해야 합니다. # ... # SSH 프로그램이 백그라운드에 배치됩니다. (ssh에서 비밀번호나 패스프레이즈를 요구하는 경우 이 방법은 작동하지 않습니다. -f 옵션도 참조하세요.)
편집하다
좋아, 그러면 find의 파일 이름이 xargs에 (문자열로) 에코되어 grep/zgrep에 인수로 전달되어야 합니다. 다음을 확인하세요(-print0은 필요 없음).
ssh user@hostname find /path/to/find/* -mtime 10 | xargs echo | zgrep -i 'pattern_to_find' | while read -r LINE do scp -r user@hostname:$LINE /path/to/destination/ done