几点评论:
首先是:
for f1 in `find ./ -name "*.txt"`
do
if test -f $f1
then
与(仅查找带有txt
扩展名的普通文件)相同
for f1 in `find ./ -type f -name "*.txt"`
更好的语法(仅限 bash)是
for f1 in $(find ./ -type f -name "*.txt")
最后整体是错误的,因为如果文件名包含空格,f1
变量将不会得到完整的路径名。所以改为for
:
find ./ -type f -name "*.txt" -print | while read -r f1
正如@Sir Athos 指出的那样,文件名可以包含\n
,所以最好使用
find . -type f -name "*.txt" -print0 | while IFS= read -r -d '' f1
第二:
再次使用-"$f1"
代替$f1
,因为$f1
可以包含空格。
第三:
进行 N*N 比较不是很有效。您应该为每个txt
文件创建一个校验和(md5 或更好的 sha256)。当校验和相同时 - 文件是重复的。
如果您不信任校验和,只需比较具有相同校验和的文件即可。具有不同校验和的文件肯定不是重复的。;)
进行校验和的速度很慢,因此您应该首先将所有文件与same size
. 不同大小的文件不重复...
您可以跳过空白txt files
- 它们都是重复的:)。
所以最终的命令可以是:
find -not -empty -type f -name \*.txt -printf "%s\n" | sort -rn | uniq -d |\
xargs -I% -n1 find -type f -name \*.txt -size %c -print0 | xargs -0 md5sum |\
sort | uniq -w32 --all-repeated=separate
评论:
#find all non-empty file with the txt extension and print their size (in bytes)
find . -not -empty -type f -name \*.txt -printf "%s\n" |\
#sort the sizes numerically, and keep only duplicated sizes
sort -rn | uniq -d |\
#for each sizes (what are duplicated) find all files with the given size and print their name (path)
xargs -I% -n1 find . -type f -name \*.txt -size %c -print0 |\
#make an md5 checksum for them
xargs -0 md5sum |\
#sort the checksums and keep duplicated files separated with an empty line
sort | uniq -w32 --all-repeated=separate
现在的输出,您可以简单地编辑输出文件并决定要删除的内容和要保留的文件。