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