grep 명령에 두 개의 *를 사용하면 아무것도 반환되지 않는 이유를 아는 사람이 있습니까? 내 원래 명령은 다음과 같습니다.
find | grep 0000\:00\:*.0/usb1/authorized_default
이 예에서는 PCI 폴더 이름을 모르는 파일을 반환하려고 합니다. 이 명령은 예상대로(* 와일드카드) 완벽하게 작동하며 usb1이 "1a" 폴더에 있는지 확인합니다.
"usb1"을 "usb*"로 바꾸기 위해 명령에 또 다른 와일드카드를 넣은 경우 grep이 어떤 결과도 반환하지 않는 이유는 무엇입니까? 나의 궁극적인 목표는 모든authorized_default 파일을 반환하는 것입니다. 이는 다른 방법으로 더 효율적으로 수행할 수 있다는 것을 알고 있습니다. 내 질문은 이 작업을 수행하는 방법이 아니지만 방정식에 다른 "*" 기호를 넣을 때 grep이 결과를 반환하지 않는 이유는 무엇입니까?
find | grep 0000\:00\:*.0/usb*/authorized_default
귀하의 시간과 답변에 미리 감사드립니다.
답변1
정규식은 0000:00:*.0/usb1/authorized_default
문자열 0000:00
+ 0개 이상의 콜론 + 모든 문자 + 와 일치합니다 0/usb1/authorized_default
.
*
합계를 바꾸면 다음을 포함하는 .
모든 문자열과 일치합니다 . ( 임의의 문자( ) 뒤에 임의의 숫자( )가 오는 것과 일치합니다.)0000:00
0/usb1/authorized_default
.*
*
.
마찬가지로 , etc. 와 usb*/
일치 하지만 는 일치하지 않습니다 .us/
usb/
usbbb/
usb1
실제로 *
매개변수에서 인용되지 않은 부분이 grep
전역 문자로 처리되는 문제도 있습니다.쉘을 통해, grep
보기도 전에요. 따라서 glob 패턴으로 일치할 수 있는 파일이 있으면 0000\:00\:*.0/usb*/authorized_default
go 에 영향을 미칩니다 grep
. 여러 일치 항목은 여러 인수로 간주되며 grep
첫 번째 일치 이후의 인수는 파일 이름으로 간주됩니다.
이런 일이 발생하지 않도록 하려면 명령줄에서 정규식 앞뒤에 따옴표를 넣으세요.
어쨌든 grep
@Kusalananda가 말했듯이 여기에는 필요조차 없습니다. 옵션을 사용하여 파일 이름을 전역 패턴과 일치시킬 -name
수 있습니다 . find
적어도 일부 구현에는 파일 이름을 정규식과 일치시키는 옵션 find
도 있습니다 .-regex
정규식에는 다양한 변형이 있습니다. 다음을 참조하세요.내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?
답변2
ilkkachu가 이미 지적했듯이 grep
기본 정규식을 사용하면 이는 :*
0개 이상 일치 :
하고 b*
0개 이상 일치함을 의미합니다 b
.
grep
를 출력하는 대신 를 find
사용하여 find
파일을 찾으세요. 일반적으로 파일 이름에는 개행 문자가 포함되어 있어 grep이 작동하지 않을 수 있습니다. 또한 보려는 경로 이름을 직접 필터링 하는 것이 find
더 효율적이고 안전합니다 .
find . -type f -name 'authorized_default'
경로 이름의 다른 부분을 일치시켜야 하는 경우:
find . -type f -path '*0000:00:*.0/usb*/authorized_default'
-path
파일 이름 와일드카드 패턴 처럼 작동 -name
하지만 경로 이름의 파일 이름 부분만이 아니라 전체 경로와 일치합니다( a 는 *
하나 이상과 일치할 수 있음 /
).
관련된: