해당 확장자가 없는 모든 파일에 대해 실행

해당 확장자가 없는 모든 파일에 대해 실행

파일에 해당 파일이 없을 때 프로그램을 찾고 실행하는 방법은 무엇입니까?

예시 파일:

/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옵션이 검색 기준 뒤에 나타날 수 있습니다.

관련 정보