패턴이 있는 파일을 찾아 최신 파일 가져오기

패턴이 있는 파일을 찾아 최신 파일 가져오기

특정 패턴이 있는 파일을 찾아 패턴과 일치하는 최신 파일을 전체 경로로 인쇄하고 싶습니다.

find ../*.gz -type f -print0 | sort -nr | cut -d: -f2- | head -n 1

동일한 전체 경로를 어떻게 인쇄할 수 있습니까?

사용자 요청 시 ls -l:

ls -l
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:29 fa1caae85
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:28 ga1c93eda
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:28 la1cbbh05
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:08 node_modules
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:08 _tasks

처음 세 폴더에는 모두 필수 파일이 포함되어 있지만 그 폴더에서 최신 파일을 가져오고 .gz싶습니다 ..gz

답변1

비정통적인 접근 방식:

zsh -c 'print -r $PWD/**/*.gz(.om[1])'

어디

  • ()after는 *.gz소위 glob 한정자를 사용하는 것을 의미합니다.
  • .일반 파일만 고려됩니다.
  • om수정 시간별로 정렬
  • [1]첫 번째 요소만 취함
  • D숨겨진 gz 파일(예: this )도 고려하려면 한정자를 추가하세요 find.

분명히 이미 zsh를 사용하고 있다면 이를 호출하는 데 사용할 필요가 없습니다 zsh -c.

답변2

이 명령을 사용하여 이 작업을 수행할 수 있습니다.

find "$(pwd)" -type f -name "*.gz" -printf "%T@ %p\n"| sort -rn | cut -d' ' -f 2- | head -n 1

findGNU 경로 이름에는 개행 문자가 포함되어 있지 않으며 파일 이름은 로케일의 유효한 텍스트라고 가정합니다 . 개행 문자와 문자가 아닌 문자를 처리하려면 다음과 같이 변경할 수 있습니다.

(
  export LC_ALL=C
  find "$PWD" -type f -name '*.gz' -printf '%T@\t%p\0' |
    sort -zrn | head -zn 1 | cut -zf 2- | tr '\0' '\n'
)

GNU 유틸리티의 버전은 비교적 새로운 버전이라고 가정합니다. 즉, NUL은 파일 경로에 나타날 수 없는 유일한 문자이기 때문에 줄(개행으로 구분된 레코드) 대신 NUL을 사용하여 레코드를 구분합니다.

POSIX 쉘에서 현재 작업 디렉토리에 대한 경로를 포함하는 변수를 사용하여 명령 대체( )를 방지합니다 $(pwd). 이는 후행 줄 바꿈을 제거합니다.$PWD

로케일을 C(여기서는 로컬 서브셸 환경에서 (...))로 전환하면 각 바이트가 항상 문자로 처리됩니다(일반적인 정렬 및 텍스트 처리도 단순화됩니다).

답변3

이것은 나에게 잘 작동합니다.

ls -t ../*.gz | head -n1

에서 man ls:

  -t                         sort by modification time, newest first

관련 정보