我有两个文件夹,每个文件夹都有数千个文件。去年的一个文件夹,每个文件都有一个字母和年份前缀 (a2020abc123.txt),今年的相同文件位于另一个具有相同格式的文件夹中 (a2021abc123.txt)。我需要比较这两个文件夹,以找到去年和今年之间存在巨大差异的任何文件。我的团队一直在这样做用手所以我想要一种更快且不易出错的方法。
例如:
/folder1/a2021fileA123.txt 50kb
/folder2/a2022fileA123.txt 80kb
/folder1/a2021fileA124.txt 79kb
/folder2/a2022fileA124.txt 80kb
/folder1/a2021fileA125.txt 90kb
/folder2/a2022fileA125.txt 80kb
理想情况下会返回类似以下内容:
/folder1/a2021fileA123.txt 50kb
/folder2/a2022fileA123.txt 80kb
/folder1/a2021fileA125.txt 90kb
/folder2/a2022fileA125.txt 80kb
/folder1/a2021fileA124.txt 79kb
/folder2/a2022fileA124.txt 80kb
我需要将成对的文件像上面一样分组在一起,这是我在我知道如何做的基本排序中遇到的问题。我对使用 awk 等工具非常陌生,我的团队更喜欢 powershell。非常感谢。几周后我都会在梦中看到这些文件名。
答案1
有很多我不确定你想要如何处理,所以这里至少是一个起点 - 这将找到你文件夹中的文件并打印它们,并以字节大小为前缀:
find folder1 folder2 -type f -printf '%s %P\n'
例如(只需手动编辑问题中的列表):
50000 a2021fileA123.txt
80000 a2022fileA123.txt
79000 a2021fileA124.txt
80000 a2022fileA124.txt
90000 a2021fileA125.txt
80000 a2022fileA125.txt
现在将其通过管道传递给此 awk 命令,它将输出 2022 和 2021 版本文件之间的大小差异:
$ cat tst.awk
{
size = $1
year = substr($2,2,4)
base = substr($2,6)
bases[base]
map[base,year] = size
}
END {
for ( base in bases ) {
print base, map[base,2022] - map[base,2021]
}
}
$ find folder1 folder2 -type f -printf '%s %P\n' | awk -f tst.awk
fileA125.txt -10000
fileA123.txt 30000
fileA124.txt 1000
通过管道将其传递到sort
以获取按大小差异排序的输出:
$ find folder1 folder2 -type f -printf '%s %P\n' | awk -f tst.awk | sort -k2,2rn
fileA123.txt 30000
fileA124.txt 1000
fileA125.txt -10000
希望有帮助。
答案2
你需要diff
#!/bin/sh
cd folder1
for f in *
do
diff $f ../folder2/$f
done