查找 /dirA/file、/dirB/file 的最大最后修改文件

查找 /dirA/file、/dirB/file 的最大最后修改文件

假设我们有两个目录,dirA,dirB,它们是完全相同的PDF文件,只是最后修改的不同。

什么是 bash 脚本(无 awk),可以搜索每个文件名(假设始终在 dirA、dirB 中),并且对于每个文件名,输出哪个文件(dirA/file 或 dirB/file)具有更大的最后修改时间;文件最后修改?例如

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(及其子目录)中的每个文件,但如果两个文件共用,则仅报告最新的文件(或者如果它们年龄相同,则随机报告其中任何一个文件)。

这只适用于dirAdirBlike的值"dirA",即不包含空白或斜杠字符,尽管它们可能包含的文件的路径没有限制。

使用 时-type f,仅报告常规文件(不报告符号链接、fifo、设备...)。

find's -printfg排序类型、uniq's选项以及、和处理 NUL 字符-f的能力是 GNU 特定的。sortuniqcut

相关内容