文件夹_1
./a20160606_000000_000021.txt 5KB
./a20160606_000000_000062.txt 5KB
./a20160606_000000_000531.txt 5KB
./a20160606_000000_004521.txt 5KB
./a20160606_000000_003211.txt 9KB
./a20160606_000000_009451.txt 9KB
./b20160606_000000_000001.txt 4KB
./b20160606_000000_000311.txt 6KB
./b20160606_000000_000632.txt 8KB
./b20160606_000000_000008.txt 9KB
./b20160606_000000_000034.txt 12KB
./b20160606_000000_000245.txt 12KB
./b20160606_000000_000333.txt 12KB
文件夹_2
./a20160607_000000_000001.txt 9KB
./a20160607_000000_000002.txt 9KB
./a20160607_000000_000311.txt 9KB
./a20160607_000000_000500.txt 9KB
./a20160607_000000_001121.txt 9KB
./a20160607_000000_004891.txt 9KB
./b20160607_000000_000021.txt 5KB
./b20160607_000000_000065.txt 5KB
./b20160607_000000_000091.txt 5KB
./b20160607_000000_000134.txt 12KB
./b20160607_000000_000521.txt 12KB
./b20160607_000000_001111.txt 12KB
我有这些文件夹,每个文件夹都包含上述文件。每个文件的大小显示在右侧(folder_1 和folder_2 位于同一文件夹中)。我的问题是如何使用删除这些重复的文件find
,并且文件必须保留必须是每个文件中最大的文件。输出必须是这样的:
文件夹_1
./a20160606_000000_009451.txt 9KB
./b20160606_000000_000333.txt 12KB
文件夹_2
./a20160607_000000_000001.txt 9KB
./b20160607_000000_001111.txt 12KB
答案1
为了严格回答您的问题,您没有基于文件名的重复文件。
如果您想根据文件名的第一部分保留最大的文件,您可以使用以下awk
脚本来获取文件名(及其大小),这些文件在第一个下划线之前不是基于前缀的最大文件(a20160606、a20160607、 ETC。):
find . -maxdepth 1 -type f -printf "%f %s\n"| awk '{
NAME=substr($1,0,9)
SIZES[$1]=$2
if ($2 > MAX[NAME]) {
MAX[NAME]=$2
}
}
END {
for (x in SIZES) {
for (y in MAX) {
if (match(x,y) && SIZES[x] != MAX[y]) {
printf "%s %d\n", x, SIZES[x]
}
}
}
}'
要获取找到的最大值的名称(及其大小)列表,请使用:
find . -maxdepth 1 -type f -printf "%f %s\n"| awk '{
NAME=substr($1,0,9)
SIZES[$1]=$2
if ($2 > MAX[NAME]) {
MAX[NAME]=$2
}
}
END {
for (x in SIZES) {
for (y in MAX) {
if (match(x,y) && SIZES[x] == MAX[y]) {
printf "%s %d\n", x, SIZES[x]
}
}
}
}'
可能有更简单的方法可以实现此目的,但这可能有助于获取要删除的文件列表。