특정 타임스탬프보다 최신인 모든 파일을 나열하고 정렬합니다.

특정 타임스탬프보다 최신인 모든 파일을 나열하고 정렬합니다.

다음보다 최신인 모든 파일을 나열하고 싶습니다(날짜순으로 정렬).타임스탬프20130207003851/tmp 디렉토리의 형식만 사용합니다. 하위 디렉터리는 생략할 수 있습니다.

SUSE Linux Enterprise Server 11을 사용합니다.

출력 형식은 다음과 같아야합니다

S0002948.LOG Feb  7 03:28 
S0002935.LOG Feb  7 05:58 
S0002952.LOG Feb  7 09:58 
S0002940.LOG Feb  7 11:58 

/tmp -newermt "2013년 2월 7일" -ls 찾기내가 원하는 파일이 나열되어 있지만

  • 20130207003851 형식의 타임스탬프를 사용하는 방법
  • 출력을 어떻게 정렬합니까?
  • 파일 이름과 날짜만 표시하려면 어떻게 해야 합니까? 파일 이름이 먼저이고 날짜가 다음입니까?

ps. 조회용 참조 파일을 생성하기 위해 터치를 사용하고 싶지 않습니다.

find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time

답변1

find많이 지원해주세요날짜 입력 형식. 가장 간단한 형식은 YYYYMMDD HH:MM:SS입니다. 이미 올바른 순서의 숫자가 있으므로 첫 번째 그룹을 추출하기만 하면 됩니다( ${timestamp%??????}: 마지막 6자를 제외한 모든 문자 추출, ${timestamp#????????}: 처음 8자를 제외한 모든 문자 추출). 그런 다음 계속해서 구두점 기호를 추가하고 다음을 추가합니다. 앞으로 나아갈 때 다음 그룹.

timestamp=20130207003851
timestring=${timestamp%??????}; timestamp=${timestamp#????????}
timestring="$timestring ${timestamp%????}"; timestamp=${timestamp#??}
timestring="$timestring:${timestamp%??}:${timestamp#??}"

bash(및 ksh 및 zsh)에서는 ash가 아닌 더 읽기 쉬운 ${STRING_VARIABLE:OFFSET:LENGTH}구성을 사용할 수 있습니다.

timestring="${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}"

날짜별로 파일을 정렬하려면 날짜 앞에 파일 이름을 인쇄하고 정렬한 다음 날짜 접두사를 제거하세요. 사용-printf출력 형식을 제어합니다. 결정된 수정 시간의 비율을 인쇄합니다. 그렇다면 Unix 시대 이후의 초 수를 얻습니다. 아래에서는 정렬 가능한 형식의 시간, 파일 이름 및 사람이 읽을 수 있는 형식의 시간이라는 세 개의 탭으로 구분된 열을 인쇄합니다. 첫 번째 열을 제거하고 예상되는 모든 파일 이름을 수용할 수 있는 충분한 공백이 있는 탭 교체를 호출합니다(필요에 따라 40 조정). 이 코드는 파일 이름에 줄 바꿈이나 탭이 없다고 가정합니다.%TXXX@cut -f 2-expand

find -maxdepth 1 -type f \
     -newermt "$timestring" -printf '%T@\t%f\t%Tb %Td %TH:%TM\n' |
sort -k1n |
cut -f 2- |
expand -t 40

답변2

그리고 zsh:

zmodload zsh/stat
newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY && (( t >= timestamp ))
}
timestamp=20130207003851
print -rl -- /tmp/*(D.Om+newer)

newer이 함수는 업데이트된 파일에 대해 true를 반환합니다 $timestamp(단, 1초 미만의 정밀도에는 지원 zsh되지 않습니다).zstat

그런 다음 우리가 해야 할 일은 zshglobbing 한정자를 사용하는 것입니다. D도트 파일을 포함하고, .일반 파일만 고려하고, Om수정 시간별로 정렬하고, 선택할 파일을 결정하는 함수를 +newer호출합니다 .newer

파일 타임스탬프도 표시하려면 다음 newer과 같이 변경할 수 있습니다.

newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY &&
    REPLY+=$'\t'$t &&
    (( t >= timestamp ))
}

파일 이름 생성 결과에는 타임스탬프가 포함되므로 더 이상 파일 이름으로 사용할 수 없습니다.

관련 정보