/dirA/file、/dirB/file のうち最後に変更されたファイルの中で最大のファイルを探す

/dirA/file、/dirB/file のうち最後に変更されたファイルの中で最大のファイルを探す

最後の修正を除いて、まったく同じPDFファイルdirAとdirBという2つのディレクトリがあるとします。

各ファイル名(常にdirA、dirBにあると仮定)を検索し、各ファイル名に対してどのファイル(dirA / fileまたはdirB / file)が最後の変更時間が大きいかを出力できるbashスクリプト(awkなし)ですか?例えば

if dirA/file.lastmodified > dirB/file.lastmodified 
##take action

答え1

GNU統計の使用:

shopt -s dotglob

for file in dirA/*; do
    [[ -f "dirB/${file##*/}" ]] || continue
    if (( "$(stat -c %Y "$file")" > "$(stat -c %Y "dirB/${file##*/}")" )); then
        # take action
    fi
done

答え2

Bash、ksh、zsh、ashには、あるファイルが他のファイルよりも最新であることをテストするための組み込み-nt演算子[(およびbash / ksh / zsh構成)があります。[[ … ]]

for x in dirA/*; do
  y=dirB/${x#*/}
  if [ "$x" -nt "$y" ]; then
    # The file in dirA is more recent
  elif [ "$y" -nt "$x" ]
    # The file in dirB is more recent
  else
    # The two files have the same modification time
    # or the file doesn't exist in dirB
  fi
done

答え3

GNUツールを使用して可能な解決策:

find dirA dirB -type f -printf '%T@/%p\0' |
  tr '\n\0\t/' '\0\n/\t' |
  sort -k3 -k1,1rg |
  uniq -f2 |
  cut -f2- |
  tr '\0/\t' '\n\t/'

dirAとdirB(およびそのサブディレクトリ)のすべてのファイルが報告されますが、2つのファイルが共通の場合は最新のファイルのみが報告されます(または2つのファイルが同じ場合はランダムに報告されます)。

これは同じdirA値にのみ適用されます。つまり、スペースやスラッシュ文字は含まれませんが、含めることができるファイルパスに制限はありません。dirB"dirA"

を使用すると、-type f通常のファイルのみが報告されます(symlink、fifo、デバイス...は報告されません)。

find-printfgソートタイプ、uniqオプション、およびNUL文字を-f処理する機能はGNUにのみ適用されます。sortuniqcut

関連情報