假设我们有两个目录,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(及其子目录)中的每个文件,但如果两个文件共用,则仅报告最新的文件(或者如果它们年龄相同,则随机报告其中任何一个文件)。
这只适用于dirA
和dirB
like的值"dirA"
,即不包含空白或斜杠字符,尽管它们可能包含的文件的路径没有限制。
使用 时-type f
,仅报告常规文件(不报告符号链接、fifo、设备...)。
find
's -printf
、g
排序类型、uniq
's选项以及、和处理 NUL 字符-f
的能力是 GNU 特定的。sort
uniq
cut