특정 패턴이 있는 파일을 찾아 패턴과 일치하는 최신 파일을 전체 경로로 인쇄하고 싶습니다.
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
find
GNU 경로 이름에는 개행 문자가 포함되어 있지 않으며 파일 이름은 로케일의 유효한 텍스트라고 가정합니다 . 개행 문자와 문자가 아닌 문자를 처리하려면 다음과 같이 변경할 수 있습니다.
(
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