마지막으로 파일을 연 시간


94

마지막으로 파일을 열었던 시간을 가져 와서 디렉토리의 모든 파일을 해당 시간별로 정렬 할 수 있습니까?

답변:


172

이것은 "열린"의 의미에 따라 다르지만 일반적으로 그렇습니다. 일반적으로 3 개의 타임 스탬프가 기록됩니다.

  • mtime— 파일 내용이 변경되면 업데이트됩니다. 대부분의 경우 이것이 "기본"파일 시간입니다.
  • ctime— 파일 또는 메타 데이터 (소유자, 권한)가 변경 될 때 업데이트
  • atime — 파일을 읽을 때 업데이트

따라서 일반적으로보고 싶은 atime것은 파일입니다. 당신과 함께 그것을 얻을 수 stat또는과 ls. 당신은 사용할 수 있습니다 ls -lu내가 사용하는 것을 선호하지만,이 일을 ls -l --time=atime내가 자주 사용하지 않기 때문에 (이는 거의 모든 현대 리눅스 배포판에서 지원해야한다), 그리고 내가 할 때 내가 더 잘 기억할 수있다. 시간별 로 정렬하려면-t ls에 플래그를 추가하십시오 . 그래서 당신은 간다.

그러나 큰 경고가 있습니다. 파일을 읽을 때마다 시간을 업데이트하면 일반적으로 불필요한 IO가 많이 발생하여 모든 것이 느려집니다. 따라서 대부분의 Linux 배포는 기본적으로 noatime파일 시스템 마운트 옵션 으로 기본 설정되어 기본적으로 atimes relatime를 종료합니다. mount명령 을 실행하여 이러한 옵션이 활성화되어 있는지 확인할 수 있습니다 .

또한 액세스 시간은 파일 이름이 아닌 inode에 의한 것이므로 하드 링크가 있으면 하나에서 읽으면 동일한 파일을 참조하는 모든 이름이 업데이트됩니다.

그리고 c 는 "창조"가 아님을 명심하십시오 . 생성은 유닉스 / 리눅스 파일 시스템에 의해 추적되지 않습니다. 이상하게 보이지만 실제로 파일 시스템이 원본인지 알 수있는 방법이 없기 때문에 실제로 의미가 있습니다. 아마도 40 년 전에 파일이 생성되어 여기에 복사되었을 수 있습니다. 실제로 많은 파일 편집기가 원본을 복사하여 작업합니다. 해당 정보가 필요한 경우와 같은 버전 관리 시스템을 사용하는 것이 가장 좋습니다 git.


9
나는 단순히 ctime "Creation Time"을 호출하지 않기 위해 +1 이상을 줄 것이다.
jsbillings

2
mount 맨 페이지에 따르면 relatime 은 일일 제한과 관련이 없지만 mtime 및 ctime을 기준으로 한 시간 만 봅니다 . atime이 mtime 또는 ctime보다 오래된 경우 atime이 업데이트됩니다. atime이 둘 다 최신 인 경우 홀로 남습니다. 일부 응용 프로그램은 마지막 업데이트 이후 편지함을 읽었는지 확인하기 위해 mutt와 같은 해당 정보를 사용하기 때문에 atime과 mtime / ctime 간의 관계 를 유지하는 것이 목적입니다 .
jw013

1
@ jw013 이것은 2.6.30 커널 이후입니다. 일부 오래된 배포판에는이 동작이 없을 수도 있습니다. (그러나 Fedora와 같은 배포판의 경우, 3 년 전에이 답변의 원본 버전을 작성했을 때도 마찬가지였습니다.) 업데이트 된 mount맨 페이지를 찾으십시오 .
mattdm

1
ls기본적으로 적절한 정밀도로 시간을 줄입니다. 시간을 완전 정밀도로 보려면를 사용할 수 있습니다 --full-time.
jlh

19

ls -ltu 액세스 시간별로 표시 및 정렬하여 모든 파일을 나열하십시오.

보낸 사람 man ls:

-u     with -lt: sort by, and show, access time with -l: show access
       time and sort by name otherwise: sort by access time

4

find명령이 가장 좋습니다. 참고 항목 -ctime, -mtime-atime옵션


3

리스팅이 사람이 소비하는 경우, ls날짜 정렬 플래그 ( -tu액세스 (읽기) 시간, -t수정 (쓰기) 시간 또는 -tcinode 변경 시간) 중 하나와 함께 사용 하십시오 . 참조 mattdm의 대답 (특히 관한주의 자세한 내용을 -a그리고의 정의 -c).

이것이 프로그램 소비를위한 것이라면 , 출력을 파싱하는 ls것은 문제가 됩니다. 쉘이 zsh 인 경우 ls어쨌든 필요하지 않습니다 . zsh에는 액세스 ( *(Oa)), inode 변경 ( *(Oc)) 또는 수정 ( *(Om)) 시간 을 늘려서 일치 항목을 정렬하는 globbing 한정자가 있습니다. o나이가 증가함에 따라 소문자가 정렬됩니다.

act_on_files_by_date *(Om)

그렇지 않으면 파일 이름에 줄 바꾸기 나 인쇄 할 수없는 문자 (현재 로캘)가 포함되어 있지 않다면 다음과 같은 작업을 수행 할 수 있습니다.

ls -t | while read -r name; do act_on_one_file "$name"; done
ls -t | xargs -I {} act_on_one_file {}

한 번에 많은 파일에서 명령을 호출하려면 추가 설정이 필요합니다. 참고 act_on_files_by_date $(ls -t)와일드 카드 문자 나 공백이 포함 된 파일 이름은 명령 치환의 결과에 확장 될 것처럼, 단지 이런 식으로 작동하지 않습니다. 다음 코드는 파일 이름에 줄 바꿈 문자 나 인쇄 할 수없는 문자가 포함되어 있지 않으면 작동합니다.

IFS='
'
set -f
act_on_files_by_date $(ls -t)
set +f
unset IFS

임의의 파일 이름을 처리하려면 표준 쉘 (zsh, perl, python)보다 더 강력한 도구를 사용하지 않고 매우 힘들 수 있습니다.

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