[linux] 하위 디렉토리와 시간이있는 디렉토리에서 최근 수정 된 파일을 재귀 적으로 찾고 나열하는 방법은 무엇입니까?

  • 운영 체제 : Linux

  • 파일 시스템 유형 : ext3

  • 선호 솔루션 : bash (script / oneliner), ruby, python

하위 디렉토리와 파일이 여러 디렉토리에 있습니다. 모든 첫 번째 레벨 디렉토리가 가장 최근에 작성 / 수정 된 파일의 날짜 및 시간 옆에 나열되도록 구성되는 모든 디렉토리 목록을 작성해야합니다.

명확히하기 위해 파일을 터치하거나 그 내용을 몇 개의 하위 디렉토리 수준 아래로 수정하면 해당 타임 스탬프가 첫 번째 수준의 디렉토리 이름 옆에 표시되어야합니다. 다음과 같은 구조의 디렉토리가 있다고 가정하십시오.

./alfa/beta/gamma/example.txt

그리고 나는 파일의 내용을 수정합니다. example.txt시간 alfa은 인간이 읽을 수있는 형태로 첫 번째 수준 디렉토리 옆에 표시되는 시간이 필요합니다 . 나는 찾기를 사용하여 몇 가지를 시도했습니다 xargs, sort및 좋아하지만 난 ‘알파’의 파일 시스템 타임 스탬프 내가 만들 때 / 변경 파일 몇 수준을 수정하지 않는 문제를 주변에 얻을 수 없습니다.



답변

이거 한번 해봐:

#!/bin/bash
find $1 -type f -exec stat --format '%Y :%y %n' "{}" \; | sort -nr | cut -d: -f2- | head

재귀 적으로 스캔을 시작해야하는 디렉토리의 경로를 사용하여 실행하십시오 (공백이있는 파일 이름을 지원함).

많은 파일이 있으면 무언가를 반환하기까지 시간이 걸릴 수 있습니다. xargs대신 사용하면 성능을 향상시킬 수 있습니다 .

#!/bin/bash
find $1 -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head

조금 더 빠릅니다.


답변

N 분 전에 파일 상태가 마지막으로 변경된 모든 파일을 찾으려면 다음을 수행하십시오 .

find -cmin -N

예를 들면 다음과 같습니다.

find -cmin -5


답변

GNU Find (참조 man find)에는 -printf파일 EPOC mtime 및 상대 경로 이름을 표시 하는 매개 변수가 있습니다.

redhat> find . -type f -printf '%T@ %P\n' | sort -n | awk '{print $2}'


답변

이 원 라이너에 대한 후광의 멋진 답변을 단축했습니다.

stat --printf="%y %n\n" $(ls -tr $(find * -type f))

업데이트 : 파일 이름에 공백이 있으면이 수정을 사용할 수 있습니다

OFS="$IFS";IFS=$'\n';stat --printf="%y %n\n" $(ls -tr $(find . -type f));IFS="$OFS";


답변

이 시도

#!/bin/bash
stat --format %y $(ls -t $(find alfa/ -type f) | head -n 1)

그것은 사용 find, 디렉토리에서 모든 파일을 수집하는 ls그들, 수정 날짜별로 정렬 목록에 head첫 번째 파일을 선택하고 마지막으로 stat멋진 형식으로 시간을 표시 할 수 있습니다.

현재 이름에 공백이나 다른 특수 문자가있는 파일은 안전하지 않습니다. 아직 귀하의 요구를 충족시키지 못하면 칭찬을 작성하십시오.


답변

이 명령은 Mac OS X에서 작동합니다.

find "$1" -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head

Linux에서는 원래 포스터가 요청한대로 stat대신gstat .

물론이 답변은 user37078 의 뛰어난 솔루션으로, 의견에서 전체 답변으로 승격되었습니다. Mac OS X 에서 사용하기 위해 CharlesB 의 통찰력을 혼합했습니다. homebrew 대신 MacPorts 에서 coreutilsgstat얻었습니다. .

그리고 이것을 ~/bin/ls-recent.sh재사용 을위한 간단한 명령으로 패키지화 한 방법이 있습니다 :

#!/bin/bash
# ls-recent: list files in a dir tree, most recently modified first
#
# Usage: ls-recent path [-10 | more]
#
# Where "path" is a path to target directory, "-10" is any arg to pass
# to "head" to limit the number of entries, and "more" is a special arg
# in place of "-10" which calls the pager "more" instead of "head".
if [ "more" = "$2" ]; then
   H=more; N=''
else
   H=head; N=$2
fi

find "$1" -type f -print0 |xargs -0 gstat --format '%Y :%y %n' \
    |sort -nr |cut -d: -f2- |$H $N


답변

모두이 게시물의 펄과 파이썬 솔루션은 나 맥 OS X에서이 문제를 해결 도움 : /unix/9247/how-to-list-files-sorted-by-modification-date-recursively -no-stat-command-avail .

게시물에서 인용 :

펄 :

find . -type f -print |
perl -l -ne '
    $_{$_} = -M;  # store file age (mtime - now)
    END {
        $,="\n";
        print sort {$_{$b} <=> $_{$a}} keys %_;  # print by decreasing age
    }'

파이썬 :

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'