수정 날짜별로 정렬된 파일을 반복적으로 나열하는 방법(stat 명령을 사용할 수 없습니다!)

수정 날짜별로 정렬된 파일을 반복적으로 나열하는 방법(stat 명령을 사용할 수 없습니다!)

현재 디렉터리의 모든 파일 목록과 수정 날짜를 얻고 해당 날짜별로 정렬하려면 어떻게 해야 합니까?

find이제 나는 , 및 를 사용하여 stat이를 달성하는 방법을 알고 있지만 sort이상한 이유로 stat상자에 설치되지 않고 설치하지 않을 것입니다.

다른 옵션이 있나요?

PS: gcc둘 중 하나도 설치되지 않았습니다.

답변1

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

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

( D숨겨진 파일이나 숨겨진 디렉터리의 파일도 나열하려면 glob 한정자를 추가하세요.)

GNU 찾기가 있는 경우 파일 수정 시간을 인쇄하고 해당 시간별로 정렬하도록 합니다. 파일 이름에 개행 문자가 없다고 가정합니다.

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
    }'

Python을 사용하는 경우(파일 이름에 개행 문자가 없다고 다시 가정):

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

답변2

GNU를 가정하면 find:

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

가장 최근 파일이 먼저 나열되도록 하려면 1n,1로 변경하십시오.1nr,1

GNU가 없으면 타임스탬프 형식이 매우 다양하기 find때문에 이것이 더 어려워집니다 ls(예: 최근에 수정된 파일의 타임스탬프 스타일이 다릅니다).

답변3

Mac에는 찾을 -printf 매개변수가 없지만 다음과 같이 할 수 있습니다.

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

답변4

일반적으로 날짜별로 파일을 찾습니다. (원본 포스터에서는 작동하지 않았지만 여기까지 왔기 때문에 다른 사람들에게도 작동할 것이라고 생각했습니다.) 내 사용 사례에서는 삭제하기 전에 확인할 수 있도록 이러한 파일을 나열하고 싶습니다.

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*

이 방법의 장점은 목록을 검토한 후 find삭제 명령을 사용하여 목록의 일부를 간단하게 바꿀 수 있다는 것입니다.

find . -type f -mtime +270 -delete

관련 정보