디렉토리에서 가장 최근의 단일 파일을 반환하는 명령을 찾고 있습니다.
에 대한 한계 매개 변수가 보이지 않습니다 ls
...
ls
또는 사용 find
없이 구문 분석합니다 -print0
. : 언급 항상 유용 BashFAQ099 는 POSIX의이 문제에 대한 답변을 제공합니다
디렉토리에서 가장 최근의 단일 파일을 반환하는 명령을 찾고 있습니다.
에 대한 한계 매개 변수가 보이지 않습니다 ls
...
ls
또는 사용 find
없이 구문 분석합니다 -print0
. : 언급 항상 유용 BashFAQ099 는 POSIX의이 문제에 대한 답변을 제공합니다
답변:
ls -Art | tail -n 1
매우 우아하지는 않지만 작동합니다.
ls
으로는 tail
, 다음 마지막 행을 인쇄합니다. IMHO 오름차순으로 정렬 head
하고 chaos
제안 된 대로 대신 사용하는 것이 좋습니다. 첫 번째 라인 헤드를 인쇄 한 후에는 다음 라인 (실제로 다음 블록)을 보내면 SIGPIPE가 상승하고 ls
종료됩니다.
ls -t | head -n1
이 명령은 실제로 현재 작업 디렉토리의 최신 수정 파일을 제공합니다.
ls -tl | head -n 1
, 내 방식대로 파이프를 통해 전체 테이블을 푸시하지 않아도됩니다.
ls -t *.png | head -n1
ls -Art | head -n1
최근에 수정 한 파일을 원할 경우
이것은 재귀 버전입니다 (즉, 특정 디렉토리 또는 하위 디렉토리에서 가장 최근에 업데이트 된 파일을 찾습니다)
find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1
편집 : Kevin이 제안한 -f 2-
대신 사용하십시오.-f 2
find $DIR -type f -exec stat -lt "%Y-%m-%d" {} \+ | cut -d' ' -f6- | sort -n | tail -1
sort -nr
사용 하여 효율성을 향상시킬 수 있습니다. (재귀 적 검색을 정렬하는 경우에도 첫 번째 또는 마지막 줄을 얻는 것이 느린 것은 아닙니다.)head -n 1
tail -n 1
find ./ -type f -printf "%T@ %p\n" -ls | sort -n | cut -d' ' -f 2- | tail -n 1 | xargs -r ls -lah
find $DIR -type f -exec stat -lt "%F %T" {} \+ | cut -d' ' -f6- | sort -n | tail -1
신뢰성에 대한 참고 사항 :
개행 문자는 파일 이름에서와 같이 유효하므로 / 기반 행 과 같은 행에 의존하는 솔루션 에는 결함이 있습니다.head
tail
GNU ls
에서 다른 옵션은 --quoting-style=shell-always
옵션과 bash
배열 을 사용하는 것입니다 .
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
( 숨겨진 파일도 고려 하려면 -A
옵션을 추가하십시오 ls
).
일반 파일 (디렉토리, fifo, 장치, 심볼릭 링크, 소켓 무시)로 제한하려면 GNU를 사용해야합니다 find
.
bash 4.4 이상 (for readarray -d
) 및 GNU coreutils 8.25 이상 (for cut -z
) :
readarray -t -d '' files < <(
LC_ALL=C find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
sort -rzn | cut -zd/ -f2)
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
또는 재귀 적으로 :
readarray -t -d '' files < <(
LC_ALL=C find . -name . -o -name '.*' -prune -o -type f -printf '%T@%p\0' |
sort -rzn | cut -zd/ -f2-)
여기서 가장 번거 로움을 피하는 zsh
대신에 글로브 한정자 를 사용하는 것이 가장 좋습니다 bash
.
현재 디렉토리의 최신 일반 파일 :
printf '%s\n' *(.om[1])
숨겨진 것 포함 :
printf '%s\n' *(D.om[1])
두 번째 최신 :
printf '%s\n' *(.om[2])
심볼릭 링크 해결 후 파일 수명 확인 :
printf '%s\n' *(-.om[1])
재귀 적으로 :
printf '%s\n' **/*(.om[1])
또한 완성 시스템 (compinit
및 co)을 사용 Ctrl+Xm하면 최신 파일로 확장되는 완료자가됩니다.
그래서:
vi Ctrl+Xm
최신 파일을 편집하게 하시겠습니까 (누르기 전에 파일을 볼 수도 있습니다) Return ).
vi Alt+2Ctrl+Xm
두 번째로 작은 파일입니다.
vi * .cCtrl+Xm
최신 c
파일.
vi * (.)Ctrl+Xm
최신 일반 파일 (디렉토리 나 fifo / 장치가 아님) 등.
zsh
팁 주셔서 감사합니다 . zsh docs에서 이에 대한 자세한 내용에 대한 링크를 제공 할 수 있습니까?
info zsh qualifiers
나는 사용한다:
ls -ABrt1 --group-directories-first | tail -n1
폴더를 제외한 파일 이름 만 알려줍니다.
ls -lAtr | tail -1
다른 솔루션에는로 시작하는 파일이 포함되어 있지 않습니다 '.'
.
이 명령에는 '.'
and 가 포함 되며 '..'
, 원하는대로 또는 아닐 수도 있습니다.
ls -latr | tail -1
dmckee의 답변을 기반으로 한 단락 변형 :
ls -t | head -1
-1
head to to 구문은 꽤 오래 전에 사용되지 않았으므로 -n 1
사용해야합니다.
나는 단지 파일 이름을 제공하고 다른 명령을 호출하지 않기 때문에 echo *(om[1])
( zsh
구문)을 좋아한다 .
필자는 개인적으로 가능한 많은 내장 bash
명령 을 사용하는 것을 선호합니다 (고가의 포크 및 exec syscall 수를 줄이기 위해). 날짜별로 정렬하려면ls
호출해야합니다. 그러나의 사용은 head
실제로 필요하지 않습니다. 나는 다음의 한 줄짜리 라이너를 사용합니다 (이름 파이프를 지원하는 시스템에서만 작동합니다).
read newest < <(ls -t *.log)
또는 가장 오래된 파일의 이름을 얻기 위해
read oldest < <(ls -rt *.log)
(두 '<'표시 사이의 간격을 염두에 두십시오!)
숨겨진 파일도 필요한 경우 -Arg를 추가 할 수 있습니다.
이것이 도움이되기를 바랍니다.
ls -t -1 | sed '1q'
폴더에서 마지막으로 수정 된 항목을 표시합니다. grep
키워드와 함께 최신 항목을 찾으 려면와 페어링
ls -t -1 | grep foo | sed '1q'
1
첫 번째 줄 head -n 1
은 q가 무엇입니까?
이 간단한 명령을 시도
ls -ltq <path> | head -n 1
파일 이름-마지막 수정을 원할 경우 path = /ab/cd/*.log
디렉토리 이름-최종 수정을 원하는 경우 경로 = / ab / cd / * /
BashFAQ / 003을 따르는 Bash 내장 기능 만 있습니다 .
shopt -s nullglob
for f in * .*; do
[[ -d $f ]] && continue
[[ $f -nt $latest ]] && latest=$f
done
printf '%s\n' "$latest"
모든 ls / tail 솔루션은 파일의 파일에 완벽하게 작동합니다 . 하위 디렉토리를 무시 - 디렉토리.
검색에 모든 파일을 재귀 적으로 포함 시키려면 찾기를 사용할 수 있습니다. gioele는 형식이 지정된 찾기 출력 정렬을 제안했습니다. 그러나 공백에주의하십시오 (그의 제안은 공백과 작동하지 않습니다).
이것은 모든 파일 이름에서 작동합니다.
find $DIR -type f -printf "%T@ %p\n" | sort -n | sed -r 's/^[0-9.]+\s+//' | tail -n 1 | xargs -I{} ls -l "{}"
이것은 mtime을 기준으로 정렬합니다. man find 참조 :
%Ak File's last access time in the format specified by k, which is either `@' or a directive for the C `strftime' function. The possible values for k are listed below; some of them might not be available on all systems, due to differences in `strftime' between systems.
@ seconds since Jan. 1, 1970, 00:00 GMT, with fractional part.
%Ck File's last status change time in the format specified by k, which is the same as for %A.
%Tk File's last modification time in the format specified by k, which is the same as for %A.
그러니 그냥 교체 %T
와 %C
ctime을 기준으로 정렬.
find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1
, 첫 번째 필드를 제외한 모든 유지 또는 대안 : find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 1 --complement | tail -n 1
ls -Frt | grep "[^/]$" | tail -n 1
하위 디렉토리를 포함하여 가장 최근에 변경된 파일을 얻으려면이 작은 oneliner로 수행 할 수 있습니다.
find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk -v var="1" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done
변경된 파일에 대해 동일하지 않고 액세스 된 파일에 대해 동일한 작업을 수행하려면
%의 Y 로부터 변수 통계 명령 %의 X . 가장 최근에 액세스 한 파일에 대한 명령은 다음과 같습니다.
find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk -v var="1" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done
둘 이상의 파일을 나열하려는 경우 두 명령 모두에서 var = "1" 매개 변수를 변경할 수도 있습니다 .
watch -n1 'ls -Art | tail -n 1'
-가장 최근 파일 표시