[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 에서 coreutils 를 gstat
얻었습니다. .
그리고 이것을 ~/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'