수정 날짜순으로 정렬 된 파일을 재귀 적으로 나열하는 방법 (stat 명령을 사용할 수 없음)


31

현재 디렉토리 아래의 모든 파일 목록을 수정 날짜와 함께 날짜별로 정렬하려면 어떻게해야합니까?

지금은 함께 그것을 달성하는 방법을 알고 find, stat그리고 sort,하지만 어떤 이상한 이유로는 stat상자에 설치되어 있지 그리고 내가 그것을 설치 얻을 수있는 확률이 낮다.

다른 옵션이 있습니까?

PS : gcc어느 쪽도 설치되어 있지 않습니다


컴파일 된 바이너리를 업로드하여 실행할 수 있습니까?
imz-Ivan Zakharyaschev 19

@ imz : 예, 다른 방법입니다. find -printf작업은 쉬운하지만 것 같다.
alex

답변:


27

가장 짧은 방법은 zsh를 사용합니다.

print -rl -- **/*(.Om)

D숨겨진 파일 또는 숨겨진 디렉토리의 파일을 나열 하려면 glob 한정자를 추가하십시오 .

GNU find가 있으면 파일 수정 시간을 인쇄하고 그 순서대로 정렬하십시오. 파일 이름에 줄 바꿈이 없다고 가정합니다.

find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'

Perl이있는 경우 (파일 이름에 줄 바꿈이 없다고 가정) :

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'

해당 서버에 대한 SSH 액세스 권한이 있는 경우 더 나은 시스템의 sshfs 를 통해 디렉토리를 마운트하십시오 .

mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt

POSIX 도구 만 있으면 파일의 수정 시간을 찾을 수있는 좋은 방법이 없기 때문에 훨씬 더 복잡합니다. 파일 시간을 검색하는 유일한 표준 방법은입니다 ls. 출력 형식은 로캘에 따라 다르며 구문 분석하기 어렵습니다.

파일에 쓸 수 있고 일반 파일 만 신경 쓰고 파일 이름에 줄 바꿈이없는 경우 다음과 같은 끔찍한 문제가 있습니다. 단일 디렉토리에서 모든 파일에 대한 하드 링크를 만들고 수정 시간별로 정렬합니다.

set -ef                       # disable globbing
IFS='
'                             # split $(foo) only at newlines
set -- $(find . -type f)      # set positional arguments to the file names
mkdir links.tmp
cd links.tmp
i=0 list=
for f; do                     # hard link the files to links.tmp/0, links.tmp/1, …
  ln "../$f" $i
  i=$(($i+1))
done
set +f
for f in $(ls -t [0-9]*); do  # for each file, in reverse mtime order:
  eval 'list="${'$i'}         # prepend the file name to $list
$list"'
done
printf %s "$list"             # print the output
rm -f [0-9]*                  # clean up
cd ..
rmdir links.tmp

가장 쉬운 방법은 아마입니다 find . -print | xargs -n99999 -s999999 ls -ltr. 그러나 (1) 512 보다 크거나 5120보다 크지 xargs않을 수 있으며 (b) 그 문제를 해결할 수 있어도 커널에 부과되는 최대 인수 크기와 환경이 여전히 존재한다는 문제가 있습니다. 대부분의 아이디어 (Perl과 Python 아이디어 저장)는 동일한 문제가 있으므로 긴 명령 줄을 작성하지 않는 것이 좋습니다. -m-s
geekosaur

특히, zsh일반적인 경우 재귀 globs를 사용하여 "인수 목록이 너무 깁니다"오류가 정기적 으로 발생합니다.
geekosaur

@geekosaur : 마지막 끔찍한 kludge 만 긴 명령 줄에 문제가 있습니다. zsh에서는 내장 기능으로 많은 작업을 수행 할 수 있습니다 (예 : print -rl **/*유일한 여유 공간은 사용 가능한 메모리의 양뿐) zargs. 한 번만 호출 find … | xargs … ls하면 제안이 올바르게 정렬 되고 파일 이름에 특수 문자가 있으면 작동하지 않습니다. xargsls
Gilles 'SO- 악마 그만'

많은 옵션으로 매우 자세한 답변을 주셔서 감사합니다! :)
alex

그래서 나는 zsh를 좋아합니다.
Profpatsch

14

GNU 가정 find:

find . -printf '%T@ %c %p\n' | sort -k 1n,1 -k 7 | cut -d' ' -f2-

변경 1n,11nr,1당신이 파일을 원하는 경우는 가장 최근에 먼저 나열.

GNU를 가지고 있지 않다면, 타임 스탬프 형식이 매우 다양 find하기 때문에 더 어려워집니다 ls(예 : 최근 수정 된 파일은 다른 스타일의 타임 스탬프를 갖습니다).


실제로 날짜 및 시간 형식을 다음과 같이 변경할 수도 있습니다. ls --time-style="..."이것이 표준인지 GNU인지, 아마도 GNU인지 확실하지 않습니다.
asoundmove

확실히 GNU.
geekosaur

@asoundmove : 불행히도 상자가 너무 오래되어 (RedHat 7.2) ls해당 옵션이 없습니다.
alex

7

Mac에서는 찾을 수있는 -printf 인수가 없지만 대신이 작업을 수행 할 수 있습니다.

find . -print0 | xargs -0 -n 100 stat -f"%m %Sm %N" | sort -n|awk '{$1="";print}'


0

하나는 이것을 시도 할 수 있습니다 (하나는 스스로 빌드해야합니다) https://github.com/shadkam/recentmost


6
유닉스 및 리눅스 스택 교환에 오신 것을 환영합니다! 이것이 이론적으로 질문에 대답 할 수 있지만 여기에 답의 핵심 부분을 포함시키고 참조 할 수있는 링크를 제공하는 것이 바람직 합니다.
slm

0

멋지고 빠른 타임 스탬프와 함께 숨겨진 파일 무시

파일 이름의 공백을 잘 처리해야합니다.

$ find . -type f -not -path '*/\.*' -printf '%TY.%Tm.%Td %THh%TM %Ta %p\n' |sort -nr |head -n 10

2017.01.25 18h23 Wed ./indenting/Shifting blocks visually.mht
2016.12.11 12h33 Sun ./tabs/Converting tabs to spaces.mht
2016.12.02 01h46 Fri ./advocacy/2016.Vim or Emacs - Which text editor do you prefer?.mht
2016.11.09 17h05 Wed ./Word count - Vim Tips Wiki.mht

find풍부한 맛이 링크를 따라 찾을 수 있습니다.


0

일반적으로 날짜별로 파일을 찾는 것에 대해 말하십시오 (원본 포스터에서는 작동하지 않지만 다른 사람들도 그렇게 생각했습니다). 내 유스 케이스에서는 삭제하기 전에 파일을 검토하기 위해 파일을 나열하려고합니다.

findutils 4.6.0으로 나는 다음을 좋아한다.

find . -type f -mtime +270 -exec ls -laFGht --time-style=iso {} \+

위의 명령은 파일 (발견 -type f현재 작업 디렉토리 (에서), .270 일 전에 수정 된) ( -mtime +270또한 -mtime 0지난 24 시간을 생산할 것이며, -mtime -5쇼 지난 5 일). 그런 다음 ls날짜별로 최신 목록을 표시하는 데 사용 합니다 ( -exec ls -laFGht --time-style=iso {} \+)

다음은 출력 샘플입니다.

-rwxrwx---+ 1 user1 208M 2018-07-16  ./filename.bak*
-rwxrwx---+ 1 user1  702 2018-07-15  ./filename.ldf*
-rwxrwx---+ 1 user1 208M 2018-07-15  ./filename.bak*

이것에 대한 가장 좋은 점은 일단 목록이 검토되면 목록 부분을 finddelete 명령 으로 바꾸는 간단한 문제입니다 .

find . -type f -mtime +270 -delete
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.