여러 파일이 포함된 디렉터리가 있습니다. 특정 문자열이 포함된 최신 파일의 전체 경로만 알면 됩니다.
이를 위해서는 macOS에서 실행해야 하며 디렉터리 경로에 공백이 포함되어 있습니다.
cd
디렉터리에 먼저 들어 가지 않고도 이 bash 명령을 호출할 수 있어야 합니다 .
참고: 여기에서 비슷한 질문을 본 적이 있지만 디렉터리의 최신 파일에 문자열이 포함되어 있는지 확인하는 것뿐입니다. 이는 디렉터리에서 두 번째로 가까운 파일에 내가 찾고 있는 문자열이 포함되어 있으면 실패한다는 의미입니다.
내가 어려움을 겪고 있는 이유 중 하나는 디렉토리에 공백이 있으면 문제가 발생하고 마지막 수정 순서대로 결과를 반환하는 플래그가 없기 때문에 xargs
.find -exec
find
참고: 파일 내용에는 파일 이름이 아닌 문자열이 포함되어야 합니다. 나는 bash가 다른 bash 스크립트의 일부이기 때문에 이를 사용하고 싶고, bash에서 이를 수행하는 방법도 알고 싶습니다.
답변1
파일 이름에서 문자열을 찾으려면 다음을 수행하십시오.
print -rC1 -- the/directory/**/*string*(Nom[1])
콘텐츠에 다음이 포함된 경우:
for f (the/directory/**/*(N.om)) grep -l -- string $f && break
(macos의 고대 버전이고 어쨌든 glob 한정자가 없는 bash가 아니라 zsh 쉘이 macos의 기본 대화형 쉘이어야 한다고 가정합니다.)
이것om
글로벌 예선 o
ullglob의 경우 m
glob 확장자를 수정 시간(최신 항목에서 가장 오래된 항목 순)으로 정렬하며 .
일반 파일만 정렬합니다. 이러한 파일에 대한 절대 경로가 필요한 경우 해당 경로를 추가하세요.N
N
:P
info zsh qualifiers
( 혹은또한 온라인에서 최신 버전의 zsh를 다운로드하세요.)더 알아보기.
Bash, sh 또는 기타 쉘에서는 언제든지 다음을 수행할 수 있습니다.
zsh -c 'any of those codes above'
답변2
Mac OS가 함께 제공되므로 복잡한 작업이 zsh
필요하지 않습니다 find
. 봐봐 man zshexpn
이제 거의 끝이야
# Usage:
# findnewest path string
#
function findnewest() {
## look recursively **; if you want only top-level files, remove the **/.
for file in $1/**/*(.Nom) ; # (om): order by modification date, youngest first
if grep -q -F -- "$2" "${file}" ; then
# you said you needed the full path:
realpath -- "${file}"
break
fi
done
}