특정 파일이 생성된 이후 또는 특정 시간 이전에 생성된 파일 찾기

특정 파일이 생성된 이후 또는 특정 시간 이전에 생성된 파일 찾기

test.txt특정 파일()이 생성되기 1시간 전이나 1시간 후에 생성된 파일을 찾으려면 쉘 스크립트가 필요합니다 .

를 선택하면 find -newer임시 파일을 생성하고 touch변경 파일 생성 시간 1시간 전의 시간을 사용한 다음 다음 보다 최신 파일 찾기를 test.txt사용 하고 마지막으로 test.txt 파일보다 1시간 전에 생성된 파일을 찾아야 한다는 의미입니다. 그런 다음 이를 찾기 위해 모든 과정을 다시 거치는 데 한 시간 이상을 소비해야 합니다.-newer tempFiletempFile나이가 많은내가 관심 있는 파일보다 간단한 질문에 답하는 것은 많은 추가 작업처럼 보입니다.

나도 본 적이 있지만 find -mminPOSIX 확장이 아닌가 걱정됩니다 find.

다른 제안이 있나요?

답변1

다음 셸 코드를 사용해 보세요.

file=</PATH/TO/FILE>
date=$(perl -le '$s = (stat($ARGV[0]))[9]; print $s;' "$file")
now=$(date +%s)
seconds=$((now - date))
mins=$((seconds / 60))
find . -mmin -$((mins + 60 )) -mmin +$((mins - 60)) -print

답변2

또 다른 복잡한 옵션:

  1. test.txt의 수정 시간( mtime) 을 얻습니다 .
  2. 계산하다 "before delta" = now + hour - mtime( mtime과거를 가정)
  3. 계산하다"after delta" = now - hour - mtime if now - mtime > hour else 0
  4. 달리기find -type f -mmin -"before delta" -mmin +"after delta"

"이전" 분 이전에 수정된 모든 파일과 "이후" 분보다 큰 분, 즉 test.txt수정 시간 +/- 시간 정도 이전에 수정된 모든 파일을 찾습니다.

nowmtime, "before", 시간을 선으로 그려 보면 "after"이해하기 쉬울 것입니다 .

date이 명령을 사용하면 nowmtime.

한 줄로:

$ find -type f -newermt "$(date -r $file) -1 hour" -a \
            \! -newermt "$(date -r $file) +1 hour"

답변3

다음을 수행할 수 있습니다.

d=$(TZ=UTC0 date -r test.txt +%Y%m%d%H%M.%S)

또는

d=$(TZ=UTC0 find test.txt -prune -printf '%TY%Tm%Td%TH%TM.%.2TS\n'

또는

d=$(TZ=UTC0 stat -f %Sm -t %Y%m%d%H%M.%S text.txt)

GNU 날짜, GNU 찾기 또는 BSD 통계에 대한 액세스 권한이 있는지 여부에 따라 다릅니다(불행히도 (합리적으로) POSIX가 없으며 파일 수정 시간을 얻을 수 있는 신뢰할 수 있는 방법이 없습니다)

그런 다음:

TZ=XXX-1 touch -t "$d" sooner
TZ=XXX+1 touch -t "$d" later
find . -newer sooner ! -newer later

형식 TZ=XXX<offset>은 표준입니다.정의"XXX" 시간대 <offset>는 UTC를 기준으로 하므로 위 TZ 변수의 "UTC" 또는 "XXX"는 임의적이며 관련이 없습니다.

, , , ( 는 말할 것도 없고)은 find -mmin모두 stat이식 가능 find -printf하거나 date +%sPOSIX 입니다.date -r--reference

perl일반적으로 둘 중 하나보다 더 널리 사용 가능하며 Perl을 사용하여 모든 작업을 수행할 수 있습니다( File::Find).

ksh93또는 zsh(더 쉽게) 전체 작업을 사내에서 수행할 수 있는 능력도 갖추고 있습니다.

나는 말했다합리적으로위에서 파일 이름이 너무 길지 않고 개행 문자를 포함하지 않는 한 파일의 수정 시간(에포크 시간)을 얻을 수 있기 때문에 POSIXly이지만 약간 복잡합니다.

{
  echo ibase=8
  printf '%s\n' test.txt |
    pax -x ustar -wd |
    dd 2> /dev/null bs=4 skip=34 count=3 |
    tr -d '\0'
  echo
} | bc

UTC 시간대 POSIXly에서 YYYYmmddHHMM.SS 형식으로 변환하는 것도 가능하지만 꽤 힘듭니다(참조http://stchaz.free.fr/wide_strftime.sh예를 들어)

관련 정보