특정 폴더에 있는 다른 파일보다 이전 날짜가 되도록 파일 날짜 수정

특정 폴더에 있는 다른 파일보다 이전 날짜가 되도록 파일 날짜 수정

파일의 날짜를 수정하고 싶습니다문서디렉토리에 존재하는 것보다 오래되게 만들려면목차. 단지 오래되게 만들기 위해 오래되게 만드는 것이 목표이기 때문에 시차의 가치는 중요하지 않습니다.

이렇게 하려면 touch file현재 날짜 값보다 이전의 날짜 값을 사용해야 합니다.목차. 가장 오래된 파일의 날짜 값을 복구하는 방법목차그리고 거기에서 일정 시간(가령 1초)을 빼면 될까요?

답변1

find-printf's 또는 with를 사용하여 타임스탬프를 얻고 stat정렬하여 가장 오래된 타임스탬프를 얻을 수 있습니다. 그런 다음 원하는 것을 빼고 이를 날짜 기준으로 사용합니다 touch. find단점은 계산할 때 제거해야 하는 분수 초를 인쇄한다는 것입니다.

oldest=$(stat -c "%Y" dir/*|sort|head -1)
touch -d "@$((oldest-1))" dir/file
# or touch -d "@$((oldest-60))" file # subtract 1 min to see the difference in normal ls -l output.

-d @seconds-since-epochGNU touch는 날짜 구문을 지원합니다. POSIX는 이를 지정하지 않습니다.

stat명령은 POSIX에서 지정되지 않으며 GNU coreutils의 일부입니다.https://stackoverflow.com/questions/27828585/posix-analog-of-coreutils-stat-command.

따라서 이 솔루션은 Linux 시스템에서 작동하지만 일반 UNIX 시스템에서는 작동하지 않을 수 있습니다.

답변2

타임스탬프를 복사한 다음 이전 타임스탬프로 조정하는 2단계 프로세스로 이 작업을 수행할 수 있습니다.

#find the eldest file in dir
eldest=$(ls -t dir | tail -1)

#duplicate the time
touch -r "dir/$eldest" myfile

#make the file one second older
touch -A -000001 myfile

답변3

이식성을 가지려면 perl타임스탬프를 수집하고 원하는 시간을 뺀 다음 touch.

t=$(perl make-oldest 1 dir/*)
if [ "$t" -gt 0 ]
then
  touch -t "$t" file
else
  echo "Sorry, unable to find a file!"
fi

...가장 오래된 Perl 스크립트는 다음과 같습니다.

#!/usr/bin/perl -w
use strict;
use POSIX qw(strftime);

my $subtract = shift;
my $oldest = 0;
for (@ARGV) {
  my @s = stat;
  next unless @s;
  if ($oldest) {
    $oldest = $s[9] if $s[9] < $oldest;
  } else {
    $oldest = $s[9];
  }
}

if ($oldest) {
  # convert ($oldest - $subtract) into CCCCYYMMDDhhmm.SS
  print strftime "%Y%m%d%H%M.%S\n", localtime($oldest - $subtract);
} else {
  print "0\n";
}

목적은 쉘이 와일드카드를 확장하여 dir/*파일 이름 목록을 얻는 것입니다. Perl 스크립트에는 "2개의" 매개변수가 있습니다. 가장 오래된 파일에서 빼는 시간(초)과 타임스탬프를 수집할 파일 목록입니다.

Perl 스크립트는 빼기 인수를 추출한 다음 지정된 파일을 반복하여 가장 오래된 수정 시간을 추적합니다. 파일을 읽을 수 없으면 0을 반환합니다(위의 래퍼 스크립트로 테스트한 대로). 만약에하나가장 오래된 파일을 찾은 다음 이 strftime함수를 사용하여 뺀 타임스탬프를 적절한 형식으로 변환합니다 touch.

답변4

3단계 솔루션이 필요합니다.

  1. 가장 오래된 타임스탬프를 추출합니다(디렉터리가 아닌 파일만).

    $ oldestfile=$(find path/to/dir/ -maxdepth 1 -type f -printf '%A@ %f\n' | sort -rn | head -n 1)
    
  2. 파일 이름 추출(타임스탬프 제거):

    $ oldestfile="${oldestfile#* }"
    
  3. touch(GNU) 파일을 올바른 시간으로 설정하세요.

    $ touch -r "$oldestfile" -d '-1 min' "file"
    

file그러면 .txt(디렉토리 제외)에 있는 가장 오래된 파일보다 1분 더 오래된 파일(존재하지 않는 경우)이 생성됩니다 path/to/dir/.

관련 정보