디렉토리에서 최근 수정된 파일을 재귀적으로 찾는 방법은 무엇입니까?
는 것 같습니다.ls
재귀 호출을 수행할 때 파일이 올바르게 정렬되지 않습니다.
ls -altR . | head -n 3
디렉터리(하위 디렉터리 포함)에서 가장 최근에 수정된 파일을 찾는 방법은 무엇입니까?
find . -type f -printf '%T@ %p\n' \
| sort -n | tail -1 | cut -f2- -d" "
큰 나무에게는, 그것은 어려울지도 모릅니다.sort
모든 것을 기억하기 위해.
%T@
타임스탬프와 합니다.sort -n
정렬합니다.tail -1
줄 높은 타임스탬프을 사용합니다.cut -f2 -d" "
출력에서 첫 번째 필드(타임스탬프)를 잘라냅니다.
편집: 다음과 같이-printf
GNU 전용일 것이며, 아도마 GNU 전고것, 실제사의 실제 입니다.stat -c
에서도 동일하게할 수 BSD에서는 동일하게 할 수 있습니다).-f "%m %N"
그렇게 보일 것입니다)
그리고 저는 복수의 부분을 놓쳤습니다. 만약 당신이 최신 파일보다 더 많은 것을 원한다면, 그냥 꼬리 논쟁을 시작하세요.
@plundra의 답변에 이어 BSD 및 OS X 버전을 소개합니다.
find . -type f -print0 \
| xargs -0 stat -f "%m %N" \
| sort -rn | head -1 | cut -f2- -d" "
결과를 정렬하고 마지막으로 수정된 결과만 유지하는 대신 awk를 사용하여 수정 시간이 가장 큰 결과만(unix 시간) 인쇄할 수 있습니다.
find . -type f -printf "%T@\0%p\0" | awk '
{
if ($0>max) {
max=$0;
getline mostrecent
} else
getline
}
END{print mostrecent}' RS='\0'
이렇게 하면 파일 수가 충분히 많은 경우 문제를 더 빨리 해결할 수 있습니다.
NUL 문자(즉, '\0')를 사용했는데, 이론적으로 파일 이름에 공백과 줄바꿈을 포함한 모든 문자가 포함될 수 있기 때문입니다.
시스템에 이러한 병리학적 파일 이름이 없는 경우 새 줄 문자도 사용할 수 있습니다.
find . -type f -printf "%T@\n%p\n" | awk '
{
if ($0>max) {
max=$0;
getline mostrecent
} else
getline
}
END{print mostrecent}' RS='\n'
게다가, 이것은 mawk에서도 작동합니다.
사람이 읽을 수 있는 타임스탬프가 있는 최신 파일을 표시합니다.
find . -type f -printf '%TY-%Tm-%Td %TH:%TM: %Tz %p\n'| sort -n | tail -n1
결과는 다음과 같습니다.
2015-10-06 11:30: +0200 ./foo/bar.txt
파일을 하려면 더많파을표면바꾸기려시로 대체합니다.-n1
가 큰
이것은 하위 디렉터리에서도 잘 작동하는 것 같습니다.
find . -type f | xargs ls -ltr | tail -n 1
파일이 너무 많은 경우 찾기를 세분화합니다.
Solaris 10에서 마지막으로 수정된 파일을 찾는 데 어려움을 겪었습니다. 기거.find
를 가지고 있지 않습니다.printf
및 옵션stat
사용할 수 없습니다.저는 저에게 적합한 다음과 같은 솔루션을 발견했습니다.
find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7 }' | sort | tail -1
파일 이름을 표시하려면 다음을 사용합니다.
find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7," ",$9 }' | sort | tail -1
설명.
find . -type f
합니다.sed 's/.*/"&"/'
을 처리합니다.xargs ls -E
로 묶인 를 옴표로경전으로 .ls
,-E
옵션을 사용하면 전체 타임스탬프(연-월-일 시간-분-초-나노초 형식)가 반환됩니다.awk '{ print $6," ",$7 }'
합니다.awk '{ print $6," ",$7," ",$9 }'
, 및 이름을 합니다.sort
합니다.tail -1
으로 수정한 파일만합니다.
저는 항상 비슷한 것을 사용하고 최근에 수정된 파일의 top-k 목록도 사용합니다.큰 디렉토리 트리의 경우 정렬을 피하는 것이 훨씬 빠를 수 있습니다.가장 최근에 수정된 상위 1개 파일의 경우:
find . -type f -printf '%T@ %p\n' | perl -ne '@a=split(/\s+/, $_, 2); ($t,$f)=@a if $a[0]>$t; print $f if eof()'
170만 개의 파일이 들어 있는 디렉터리에서 3.4초 내에 가장 최신의 파일을 얻을 수 있습니다. 이는 정렬을 사용한 25.5초 솔루션 대비 7.5배 빠른 속도입니다.
이렇게 하면 정렬된 목록이 표시됩니다.
find . -type f -ls 2>/dev/null | sort -M -k8,10 | head -n5
정렬 명령에 '-r'을 넣어 순서를 반대로 합니다.파일 이름만 원하는 경우 '| head' 앞에 "awk '{print $11}' |"를 삽입합니다.
다음은 더 짧고 해석 가능한 출력입니다.
find . -type f -printf '%TF %TT %p\n' | sort | tail -1
형식 할 때, . 우리는 사전 정렬이 -n
옵션을 선택할 수 있습니다.
타임스탬프를 다시 제거하려면 다음을 사용할 수 있습니다.
find . -type f -printf '%TFT%TT %p\n' | sort | tail -1 | cut -f2- -d' '
용사를 합니다.find
타임스탬프로.
다음은 하위 디렉터리가 있는 디렉터리에서 최신 수정된 파일을 찾아 나열하는 방법입니다.숨겨진 파일은 의도적으로 무시됩니다.시간 형식을 사용자 정의할 수 있습니다.
$ find . -type f -not -path '*/\.*' -printf '%TY-%Tm-%Td %TH:%TM %Ta %p\n' |sort -nr |head -n 10
결과
파일 이름의 공백을 완벽하게 잘 처리합니다. 사용해서는 안 됩니다!
2017-01-25 18:23 Wed ./indenting/Shifting blocks visually.mht
2016-12-11 12:33 Sun ./tabs/Converting tabs to spaces.mht
2016-12-02 01:46 Fri ./advocacy/2016.Vim or Emacs - Which text editor do you prefer?.mht
2016-11-09 17:05 Wed ./Word count - Vim Tips Wiki.mht
더
보기 » find
링크를 따라 이동합니다.
Ubuntu 13에서 다음은 정렬을 뒤집고 'tail' 대신 'head'를 사용하여 작업을 줄여주기 때문에 조금 더 빠를 수 있습니다.트리에서 최신 파일 11개를 표시하는 방법
find. -type f -printf '%T@ %p\n' | sort -n -r | head -11 | cut -f2--d" | sed -e's,^/,' | xargs ls -U -l
이렇게 하면 다시 정렬하지 않고 전체 목록을 제공하고 '찾기'가 모든 파일 이름에 붙이는 성가신 '/.'를 생략할 수 있습니다.
또는 배시 함수로서:
treecent () {
local numl
if [[ 0 -eq $# ]] ; then
numl=11 # Or whatever default you want.
else
numl=$1
fi
find . -type f -printf '%T@ %p\n' | sort -n -r | head -${numl} | cut -f2- -d" " | sed -e 's,^\./,,' | xargs ls -U -l
}
여전히, 대부분의 작업은 플런드라의 원래 솔루션에 의해 수행되었습니다.감사합니다.
저도 같은 문제에 직면했습니다.나는 가장 최근의 파일을 재귀적으로 찾아야 합니다.찾는 데 약 50분이 걸렸습니다.
다음은 이를 더 빠르게 수행하기 위한 작은 스크립트입니다.
#!/bin/sh
CURRENT_DIR='.'
zob () {
FILE=$(ls -Art1 ${CURRENT_DIR} | tail -n 1)
if [ ! -f ${FILE} ]; then
CURRENT_DIR="${CURRENT_DIR}/${FILE}"
zob
fi
echo $FILE
exit
}
zob
디렉터리의 가장 최근에 수정된 항목을 가져오는 재귀 함수입니다.이 항목이 디렉토리일 경우 함수를 재귀적으로 호출하여 이 디렉토리 등을 검색합니다.
지난 60분 동안 수정된 /target_directory 및 모든 하위 디렉토리의 파일을 검색하려면:
$ find /target_directory -type f -mmin -60
업데이트 시간의 역순으로 정렬된 가장 최근에 수정된 파일을 찾으려면(즉, 가장 최근에 업데이트된 파일을 먼저 찾으십시오):
$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
실행 중인 경우stat
각 파일에서 개별적으로 사용할 수 있는 속도를 늦추는 것입니다.xargs
속도를 높입니다.
find . -type f -print0 | xargs -0 stat -f "%m %N" | sort -n | tail -1 | cut -f2- -d" "
이렇게 하면 현재 디렉터리에 있는 모든 디렉터리의 수정 시간이 각 디렉터리에 있는 최신 파일로 재귀적으로 변경됩니다.
for dir in */; do find $dir -type f -printf '%T@ "%p"\n' | sort -n | tail -1 | cut -f2- -d" " | xargs -I {} touch -r {} $dir; done
이 단순한 CLI도 작동합니다.
ls -1t | head -1
-1을 나열할 파일 수로 변경할 수 있습니다.
다음 명령은 Solaris에서 작동했습니다.
find . -name "*zip" -type f | xargs ls -ltr | tail -1
사용 후find
수년간 솔루션을 기반으로 한 결과, 다음과 같은 디렉터리를 제외할 수 있는 기능을 원했습니다..git
.
이걸로 바꿨어요.rsync
기반 솔루션.이거 넣어주세요~/bin/findlatest
:
#!/bin/sh
# Finds most recently modified files.
rsync -rL --list-only "$@" | grep -v '^d' | sort -k3,4r | head -5
지금이다findlatest .
가장 최근에 수정된 파일 5개를 나열합니다.findlatest --exclude .git .
의 항목을 제외한 5개 항목을 나열합니다..git
.
이것은 "대상 없이 단일 소스 arg가 [orsync]로 지정되면 파일은 ls-l과 유사한 출력 형식으로 나열됩니다." (rsync
man page).
rsync 인수를 가져오는 기능은 rsync 기반 백업 도구와 함께 사용할 때 유용합니다.예를 들어 나는 사용합니다.rsnapshot
응용프로그램 디렉토리를 백업합니다.rsnapshot.conf
선:
backup /var/atlassian/application-data/jira/current/ home +rsync_long_args=--archive --filter="merge /opt/atlassian/jira/current/backups/rsync-excludes"
어디에rsync-excludes
백업하지 않을 디렉터리를 나열합니다.
- log/
- logs/
- analytics-logs/
- tmp/
- monitor/*.rrd4j
백업할 최신 파일을 이제 볼 수 있습니다.
findlatest /var/atlassian/application-data/jira/current/ --filter="merge /opt/atlassian/jira/current/backups/rsync-excludes"
위의 명령어가 유용하다는 것을 알았지만, 저의 경우 파일의 날짜와 시간을 확인해야 했고 이름에 공백이 있는 여러 파일에 문제가 있었습니다.여기 제 작업 해결책이 있습니다.
find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | sed 's/.*/"&"/' | xargs ls -l
나는 이것을 더 선호합니다, 그것은 더 짧습니다:
find . -type f -print0|xargs -0 ls -drt|tail -n 1
저도 해결책이 필요해서 이 질문을 위해 pypi/github 패키지를 작성했습니다.
https://github.com/bucknerns/logtail
설치:
pip install logtail
용도: 변경된 파일의 꼬리
logtail <log dir> [<glob match: default=*.log>]
Usage2: 편집기에서 최근에 변경된 파일을 엽니다.
editlatest <log dir> [<glob match: default=*.log>]
언급URL : https://stackoverflow.com/questions/4561895/how-to-recursively-find-the-latest-modified-file-in-a-directory
'bestsource' 카테고리의 다른 글
"통과" 문을 어떻게 사용합니까? (0) | 2023.05.09 |
---|---|
Azure 호스팅된 WebApp의 IP 주소를 확인하는 방법 (0) | 2023.05.09 |
mongodb에서 업데이트 문서 수를 제한하는 방법 (0) | 2023.05.09 |
린트: "가 " 오류로 번역되지 않음을 무시하는 방법? (0) | 2023.05.09 |
bash 별칭 명령(단일 따옴표와 이중 따옴표 모두 포함) (0) | 2023.05.04 |