bestsource

디렉토리에서 최근 수정된 파일을 재귀적으로 찾는 방법은 무엇입니까?

bestsource 2023. 5. 9. 22:52
반응형

디렉토리에서 최근 수정된 파일을 재귀적으로 찾는 방법은 무엇입니까?

는 것 같습니다.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과 유사한 출력 형식으로 나열됩니다." (rsyncman 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

반응형