【发布时间】:2011-10-02 02:57:24
【问题描述】:
我通过执行各种命令得到了这个输出
d41d8cd98f00b204e9800998ecf8427e 1317522632 /home/evan/school_work/unix/Projects/Project2/finddups/test/New Text Document.txt
d41d8cd98f00b204e9800998ecf8427e 1317522632 /home/evan/school_work/unix/Projects/Project2/finddups/test/New Text Document - Copy.txt
d41d8cd98f00b204e9800998ecf8427e 1317522632 /home/evan/school_work/unix/Projects/Project2/finddups/test/New Text Document - Copy (2).txt
d41d8cd98f00b204e9800998ecf8427e 1317506438 /home/evan/school_work/unix/Projects/Project2/finddups/.svn/tmp/tempfile.tmp
2430ffcf28e7ef6990e46ae081f1fb08 1317522636 /home/evan/school_work/unix/Projects/Project2/finddups/test/New folder/junk2 - Copy.txt
2430ffcf28e7ef6990e46ae081f1fb08 1317506569 /home/evan/school_work/unix/Projects/Project2/finddups/test/New folder/junk2.txt
我想通过 awk 管道让它看起来像这样
Duplicate: /home/evan/school_work/unix/Projects/Project2/finddups/test/New Text Document.txt
Duplicate: /home/evan/school_work/unix/Projects/Project2/finddups/test/New Text Document - Copy.txt
Duplicate: /home/evan/school_work/unix/Projects/Project2/finddups/test/New Text Document - Copy (2).txt
Original: /home/evan/school_work/unix/Projects/Project2/finddups/.svn/tmp/tempfile.tmp
Duplicate: /home/evan/school_work/unix/Projects/Project2/finddups/test/New folder/junk2 - Copy.txt
Original: /home/evan/school_work/unix/Projects/Project2/finddups/test/New folder/junk2.txt
有什么想法吗?
一些说明:
换行符或EOF之前的最后一个文件将永远是原始文件,之前的所有内容都应标记为重复。
第一列是文件的md5sum,第二列是修改日期。您会注意到组中的最后一个文件总是有最旧的时间戳,这是我用来确定哪个文件是“原始”文件的标准,最旧的文件。
这是我用来获取所有重复项列表的命令
find ${PWD} -type f -exec stat -c %Y {} \; -exec md5sum '{}' \; | sed -r 'N;s/([0-9]+)\n([^ ]+) /\2 \1/g' | sort -r | uniq -w 32 --all-repeated=separate
【问题讨论】:
-
你保证每组最后一行之后出现空行吗?这是否包括“在最后一组之后”(所以最后一行输入总是一个空行)?你保证文件名不包含空格(或制表符)吗?
-
哦 - 废话;讨厌水平滚动条...数据在文件名中显然有空格。所以 awk 不是一个合适的工具;您无法可靠地拆分行(它将拆分空格上的字段,并且相邻的空格将是一个分隔符)。遗憾;这种方式更难。