와일드카드를 사용하여 `ls`를 재귀적으로 실행

와일드카드를 사용하여 `ls`를 재귀적으로 실행

다음을 사용하여 특정 파일 형식의 모든 프로젝트 파일을 찾으려고 합니다.

ls -ltR *.mb

여러 폴더에 원하는 파일이 있다는 것을 알고 있지만 결과가 반환되지 않습니다. 내가 뭘 잘못했나요?

답변1

ls패턴이 일치하지 않습니다. 단순히 입력 인수에 파일이나 폴더를 나열합니다. *.mb쉘에 의해 확장됨~ 전에에 전달 ls하므로 현재 디렉터리에 이름이 지정된 파일이 없으면 *.mb아무 것도 출력되지 않습니다. 그렇지 않으면 현재 디렉터리의 파일만 출력됩니다.

파일을 재귀적으로 나열하는 표준 방법은 다음을 사용하는 것입니다.find

find . -name '*.mb' -type f -printf "%-.22T+ %M %n %-8u %-8g %8s %Tx %.8TX %p\n" | sort | cut -f 2- -d ' '

이렇게 하면 원하는 대로 출력 목록 형식을 사용자 정의할 수 있습니다. 보다:마지막 편집 날짜별로 파일 나열


다른 방법은 다음을 사용하는 것입니다.globstar다음을 사용하여 활성화할 수 있습니다.shopt -s globstar

ls -ltR **/*.mb

첫 번째는 **/임의의 하위 디렉터리 경로와 일치합니다. 그런 다음 *.mb해당 디렉토리의 파일을 일치시키십시오.

  • 글로스타

    **설정된 경우 파일 이름 확장 컨텍스트에 사용된 패턴은 모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리와 일치합니다. 패턴 뒤에 가 오면 /디렉터리와 하위 디렉터리만 일치합니다.

https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

답변2

@phuclv에는 두 가지 좋은 옵션이 있습니다. 유사한 작업을 수행해야 하는 경우 일반적으로 다음과 같이 ls의 출력을 grep으로 파이프합니다.

ls -ltR | grep .*\.mb

이는 ls의 출력을 stdout으로 출력하는 대신 grep의 입력으로 보내고 grep은 정규식과 일치하는 항목이 하나 이상 포함된 행만 출력합니다.

정규식

.*\.mb

다음과 같이 설명할 수 있습니다.

.: match any character
*: preceding character or group should appear 0 or more times
\.mb: literally .mb

관련 정보