从包含subdir的列表中删除重复项

时间:2015-11-30 23:58:25

标签: shell

我有以下文件列表:

dir1/file1
dir1/file2
dir1/file3
dir2/file2 (dup)
dir2/file4

我希望文件输出为:

 dir1/file1
    dir1/file2
    dir1/file3
    dir2/file4

嵌入式系统因此无法使用https://unix.stackexchange.com/questions/71176/find-duplicate-files

中提到的工具

1 个答案:

答案 0 :(得分:0)

查看busybox可用的命令,如果我了解您希望仅使用可用的工具将mv中包含的非重复文件合并到dir2 dir1 busybox,然后使用diff -q进行 linewise 比较将是一种有效的解决方案。 (你也可以以类似的方式使用cmp,但它的逐字节比较可能会慢一点。)

比较将需要一个强制逐个文件比较来比较然后移动文件而不受数组的好处。将dir1dir2作为脚本参数的简短shell脚本可以按如下方式实现:

#!/bin/sh

[ -d "$1" -a -d "$2" ] || {
    printf "usage:  %s dir1 dir2\n" "$0"
    exit 1
}

## move all files in dir2 that do not match a file in dir1 (linewise)
#  to dir1
for i in "$2"/*; do
    for j in "$1"/*; do
        diff -q "$i" "$j" && isdup=1 || isdup=0
    done
    [ "$isdup" -eq 0 ] && mv "$i" "$1"
done

printf "rm -r %s\n" "$2"
# rm -r "$2"            ## you can uncomment to actually remove dir2

注意:如果您在确认脚本操作后选择,则可以取消注释dir2的实际删除。

测试文件/目录

$ dir1> echo a > file1
$ dir1> echo b > file2
$ dir1> echo c > file3
$ dir2> echo b > file2
$ dir2> echo d > file4

$ ls -l dir1
total 20
-rw-r--r-- 1 david david    2 Nov 30 23:48 file1
-rw-r--r-- 1 david david    2 Nov 30 23:48 file2
-rw-r--r-- 1 david david    2 Nov 30 23:48 file3

$ ls -l dir2
total 16
-rw-r--r-- 1 david david    2 Nov 30 23:48 file2
-rw-r--r-- 1 david david    2 Nov 30 23:48 file4

使用/输出

$ sh ../../bbdupes.sh dir1 dir2
Files dir2/file2 and dir1/file1 differ
Files dir2/file2 and dir1/file3 differ
Files dir2/file4 and dir1/file1 differ
Files dir2/file4 and dir1/file2 differ
Files dir2/file4 and dir1/file3 differ
rm -r dir2

$ ls -l dir1
-rw-r--r-- 1 david david    2 Nov 30 23:48 file1
-rw-r--r-- 1 david david    2 Nov 30 23:48 file2
-rw-r--r-- 1 david david    2 Nov 30 23:48 file3
-rw-r--r-- 1 david david    2 Nov 30 23:48 file4

注意:要取消显示文件不同的默认输出,请在>/dev/null 2>&1命令后添加diff -q

如果您还有其他问题,请与我们联系。