다음을 사용하여 특정 파일 형식의 모든 프로젝트 파일을 찾으려고 합니다.
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