特定のフォルダ内の他のファイルより前の日付になるようにファイルの日付を変更する

特定のフォルダ内の他のファイルより前の日付になるようにファイルの日付を変更する

ファイルの日付を変更したい文書ディレクトリに存在するよりも古いものにするには目次。ただ古いものにするために古いものを作ることが目標であるため、時差の価値は重要ではありません。

これを行うには、touch file現在の日付値より前の日付値を使用する必要があります。目次。最も古いファイルの日付値を回復する方法目次そしてそこから一定時間(例えば1秒)を引くといいでしょうか?

答え1

find-printf'sまたはwithを使用してタイムスタンプを取得してstatソートして、最も古いタイムスタンプを取得できます。次に、必要なものを除き、それを日付基準として使用しますtouchfind欠点は、計算時に削除する必要がある分数秒を印刷することです。

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/

関連情報