Linux 터미널에서 특정 문자열을 포함하는 정렬된 파일 목록을 표시하는 방법

Linux 터미널에서 특정 문자열을 포함하는 정렬된 파일 목록을 표시하는 방법

서로 다른 디렉터리에 3개의 폴더가 있고 그 중 일부에는 더 많은 하위 폴더가 포함되어 있으며 각 폴더/하위 폴더에는 어떤 방식으로든 문자열을 포함하는 test1, test2등 이라는 이름의 텍스트 파일이 있다고 가정합니다. 그냥 일 수도 있고 , 등등 일 수도 있습니다 .test3hellohellohelloJASKFNASKFN

해당 파일의 정렬된 목록을 표시하려면 어떻게 해야 합니까? 이름이나 수정된 ​​날짜별로 정렬하고 싶다고 가정해 보겠습니다. grepor 명령을 사용하여 해당 파일을 검색하고 표시할 수 있다는 것을 이해 find하지만 정렬된 방식으로 표시할 수 있는 방법은 잘 모르겠습니다.

답변1

파일 목록을 다음으로 전달하기 전에 먼저 정렬하면 더 쉽습니다 grep.

에서는 zsh다음을 수행할 수 있습니다.

grep -le hello -- **/test<->(.)

이름 뒤에 하나 이상의 십진수( 숫자 범위와 일치하는 패턴 의 형태 ) hello가 오는 파일의 내용에서 현재 작업 디렉터리 안이나 아래에서 숨겨진 디렉터리를 건너뛰고 찾습니다 .test<-><x-y>

기본적으로 Glob 확장은 이름별로 정렬됩니다.

수정 시간별로 정렬하려면 (.om)대신 를 사용하십시오 (.). 또는 (.oL)크기별로. info zsh qualifiersglob 한정자 목록과 o한정자가 정렬할 수 있는 기준 목록은 을 참조하세요 .

순서를 반대로 바꾸려면 다음 o으로 바꿉니다 ( 이름을 기준으로 역순으로 정렬하려면).OOn

(.n)숫자로 정렬하려면 이름별 정렬을 사용합니다 ( 및 사이가 아닌 test10뒤에 옵니다 ).test9test1test2

당신이인수가 너무 많습니다.execve()오류( 대부분 시스템의 시스템 호출 제한으로 인해 발생 ):

autoload -Uz zargs # best in ~/.zshrc
zargs -- **/test<->(.) -- grep -le hello --

GNU 도구 및 모든 셸(한 줄에 명령을 입력해야 하는 (t)csh 제외):

이름순으로 정렬하려면:

LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
  -regex '.*/test[0-9]+' -type f -print0 |
  sort -z |
  xargs -r0 grep -le hello --

( 숫자 정렬 -V옵션을 추가하세요)sort

수정 시간별로 정렬하려면:

LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
  -regex '.*/test[0-9]+' -type f -printf '%T@\t%p\0' |
  sort -zrn |
  cut -zf2- |
  xargs -r0 grep -le hello --

순서를 바꾸려면 -r에 추가/제거하세요 .sort

관련 정보