![해당 확장자가 없는 모든 파일에 대해 실행](https://linux55.com/image/223711/%ED%95%B4%EB%8B%B9%20%ED%99%95%EC%9E%A5%EC%9E%90%EA%B0%80%20%EC%97%86%EB%8A%94%20%EB%AA%A8%EB%93%A0%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%EB%8C%80%ED%95%B4%20%EC%8B%A4%ED%96%89.png)
파일에 해당 파일이 없을 때 프로그램을 찾고 실행하는 방법은 무엇입니까?
예시 파일:
/file1.c
/file1.h
/file2.c
/file3.c
/file3.hpp
/file4.c/unrelated.txt
find / -type f -name '*.c' -exec my_program_here {} \;
실행 날짜:
/file1.c
/file2.c
/file3.c
하지만 해당 파일이 있는 파일을 필터링하고 싶습니다 .h
. 마지막으로 my_program_here
다음에서 실행되어야 합니다.
/file2.c
/file3.c
나는*.h
존재하는 모든 결과를 어떻게 필터링할 수 있나요 ?
답변1
래퍼를 직접 실행하는 대신 sh
래퍼를 실행해 보세요 . my_program_here
예를 들어:
find . -type f -name '*.c' -exec \
sh -c '[ ! -e "${1%c}h" ] && my_program_here "$1"' find-sh {} \;
또는 (sh를 한 번 포크하고 일치하는 모든 .c 파일을 반복):
find . -type f -name '*.c' -exec sh -c \
'for f; do
[ ! -e "${f%c}h" ] && my_program_here "$f"
done' find-sh {} +
이는 쉘의 인수 확장된 %
"일치하는 접미사 제거" 기능을 사용하여 현재 처리 중인 .c 파일에 대해 일치하는 .h 파일이 있는지 확인합니다. 존재하지 않으면 파일 이름을 인수로 사용하여 my_program_here를 실행합니다.
~에서https://pubs.opengroup.org/onlinepubs/007908775/xcu/chap2.html
${parameter%word}
최소 접미사 패턴을 제거합니다. 단어가 확장되어 패턴이 생성됩니다. 매개변수 확장은 접미사의 가장 작은 부분이 삭제된 패턴과 일치하는 매개변수를 생성합니다.
이 기능은 bash, ksh 및 기타 posix 호환 bourne 유사 쉘에서 사용할 수 있습니다.
답변2
면책조항: 저는 이 책의 현재 저자입니다.생가죽(오른쪽 회전) 여기에 사용된 절차(참조https://github.com/raforg/rawhide).
더 짧지만 (그만큼 까다롭습니다)오른쪽 회전선택하다:
rh -X 'my_program_here %S' 'f && "*.c" && !"n=%S; [ -f \"${n%%c}h\" ]".sh'
-X 'my_program_here %S'
GNU 와 마찬가지로찾다--execdir
일치하는 각 파일이 포함된 디렉터리로 안전하게 chdir을 지정 하고 %S
각 파일의 기본 이름을 인용합니다(예:찾다의 {}
).
-x 'my_program_here %s'
당신은 다음과 같은 것을 사용할 수 있습니다찾다--exec
일치하는 파일의 전체 경로를 안전하지 않게 인용하는 경우( %s
예:찾다의 {}
).
검색 기준은 쉘 이스케이프()를 사용하여 해당 *.h 파일이 존재하지 않는 f
*.c()라는 파일을 검색합니다 . double %( )는 쉘 인수 확장을 사용하지 않습니다 . 쉘 이스케이프 문자열에서 따옴표로 묶인 작은따옴표 일 뿐입니다 ."*.c"
!"n=%S; [ -f \"${n%%c}h\" ]".sh
%%
${var%%suffix}
%
Linux에서는 이 -X
옵션이 검색 기준 뒤에 나타날 수 있습니다.