현재 디렉토리 아래의 모든 파일 목록을 수정 날짜와 함께 날짜별로 정렬하려면 어떻게해야합니까?
지금은 함께 그것을 달성하는 방법을 알고 find
, stat
그리고 sort
,하지만 어떤 이상한 이유로는 stat
상자에 설치되어 있지 그리고 내가 그것을 설치 얻을 수있는 확률이 낮다.
다른 옵션이 있습니까?
PS : gcc
어느 쪽도 설치되어 있지 않습니다
find
-printf
작업은 쉬운하지만 것 같다.
현재 디렉토리 아래의 모든 파일 목록을 수정 날짜와 함께 날짜별로 정렬하려면 어떻게해야합니까?
지금은 함께 그것을 달성하는 방법을 알고 find
, stat
그리고 sort
,하지만 어떤 이상한 이유로는 stat
상자에 설치되어 있지 그리고 내가 그것을 설치 얻을 수있는 확률이 낮다.
다른 옵션이 있습니까?
PS : gcc
어느 쪽도 설치되어 있지 않습니다
find
-printf
작업은 쉬운하지만 것 같다.
답변:
가장 짧은 방법은 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
zsh
일반적인 경우 재귀 globs를 사용하여 "인수 목록이 너무 깁니다"오류가 정기적 으로 발생합니다.
print -rl **/*
유일한 여유 공간은 사용 가능한 메모리의 양뿐) zargs
. 한 번만 호출 find … | xargs … ls
하면 제안이 올바르게 정렬 되고 파일 이름에 특수 문자가 있으면 작동하지 않습니다. xargs
ls
GNU 가정 find
:
find . -printf '%T@ %c %p\n' | sort -k 1n,1 -k 7 | cut -d' ' -f2-
변경 1n,1
에 1nr,1
당신이 파일을 원하는 경우는 가장 최근에 먼저 나열.
GNU를 가지고 있지 않다면, 타임 스탬프 형식이 매우 다양 find
하기 때문에 더 어려워집니다 ls
(예 : 최근 수정 된 파일은 다른 스타일의 타임 스탬프를 갖습니다).
ls --time-style="..."
이것이 표준인지 GNU인지, 아마도 GNU인지 확실하지 않습니다.
ls
해당 옵션이 없습니다.
하나는 이것을 시도 할 수 있습니다 (하나는 스스로 빌드해야합니다) https://github.com/shadkam/recentmost
파일 이름의 공백을 잘 처리해야합니다.
$ 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
풍부한 맛이 링크를 따라 찾을 수 있습니다.
일반적으로 날짜별로 파일을 찾는 것에 대해 말하십시오 (원본 포스터에서는 작동하지 않지만 다른 사람들도 그렇게 생각했습니다). 내 유스 케이스에서는 삭제하기 전에 파일을 검토하기 위해 파일을 나열하려고합니다.
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
delete 명령 으로 바꾸는 간단한 문제입니다 .
find . -type f -mtime +270 -delete