[shell] 여러 패턴과 일치하는`find -name` 패턴

명령을 사용하여 디렉토리에있는 모든 파이썬 및 HTML 파일 목록을 가져 오려고했습니다 find Documents -name "*.{py,html}".

그런 다음 맨 페이지가 나왔습니다.

패턴 내의 중괄호 ( ‘{}’)는 특수한 것으로 간주되지 않습니다 (즉, find. -name ‘foo {1,2}’는 foo1 및 foo2 파일이 아니라 foo {1,2}라는 파일과 일치합니다.

이것이 파이프 체인의 일부이므로 런타임에 일치하는 확장명을 지정할 수 있기를 원합니다 (하드 코딩 없음). 만약 그것을 찾을 수 없다면, perl one-liner (또는 이와 유사한)가 좋습니다.

편집 : 결국 내가 찾은 대답에는 모든 종류의 쓰레기가 포함되어 있으며 조금 길기 때문에 처음에 가려운 원래 가려움증에 대한 답변 으로 게시했습니다 . 더 나은 솔루션이 있다면 자유롭게 해킹하십시오.



답변

-o“또는”을 의미 하는를 사용하십시오 .

find Documents \( -name "*.py" -o -name "*.html" \)

프로그래밍 방식으로 해당 명령 줄을 작성해야합니다. 쉽지 않습니다.

bash (또는 Windows의 Cygwin)를 사용하고 있습니까? 당신이 있다면, 당신은 이것을 할 수 있어야합니다 :

ls **/*.py **/*.html

프로그래밍 방식으로 빌드하기가 더 쉬울 수 있습니다.


답변

대부분 리눅스 시스템에서 발견 된 일부 에디션은 정규식과 일치하는 이름을 가진 파일을 찾는 -regex 및 -regextype 옵션도 지원합니다.

예를 들어

find . -regextype posix-egrep -regex ".*\.(py|html)$" 

위의 예에서 트릭을 수행해야합니다. 그러나 이것은 표준 POSIX 찾기 기능이 아니며 구현에 따라 다릅니다.


답변

다음 -name과 같이 구분하여 프로그래밍 방식으로 더 많은 절을 추가 할 수 있습니다 -or.

find Documents \( -name "*.py" -or -name "*.html" \)

또는 간단한 루프를 대신 사용하십시오.

for F in Documents/*.{py,html}; do ...something with each '$F'... ; done


답변

이것은 리눅스에서 모든 .c 또는 .cpp 파일을 찾을 것입니다

$ find . -name "*.c" -o -name "*.cpp"

추가 모드를 수행하지 않으면 이스케이프 처리 된 괄호가 필요하지 않습니다. 여기 맨 페이지에서 패턴이 일치하면 인쇄합니다. 아마도 그들은 인쇄를 제어하려고합니다. 이 경우 -print는 조건부 역할을하며 “AND’d”조건부가됩니다. .c 파일이 인쇄되지 않습니다.

$ find .  -name "*.c" -o -name "*.cpp"  -print

그러나 원래의 답변을 좋아한다면 인쇄를 제어 할 수 있습니다. 모든 .c 파일도 찾을 수 있습니다.

$ find . \( -name "*.c" -o -name "*.cpp" \) -print

모든 c / c ++ 소스 파일에 대한 마지막 예

$ find . \( -name "*.c" -o -name "*.cpp"  -o -name "*.h" -o -name "*.hpp" \) -print


답변

나는 비슷한 필요성이 있었다. 이것은 나를 위해 일했다 :

find ../../ \( -iname 'tmp' -o -iname 'vendor' \) -prune -o \( -iname '*.*rb' -o -iname '*.rjs' \) -print


답변

내 기본값은 다음과 같습니다.

find -type f | egrep -i "*.java|*.css|*.cs|*.sql"

findBrendan Long과 Stephan202 등의 적은 프로세스 의도 실행 과 같이 :

find Documents \( -name "*.py" -or -name "*.html" \)


답변

#! /bin/bash
filetypes="*.py *.xml"
for type in $filetypes
do
find Documents -name "$type"
done

간단하지만 작동 🙂