我有以下文件列表:
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
中提到的工具答案 0 :(得分:0)
查看busybox可用的命令,如果我了解您希望仅使用可用的工具将mv
中包含的非重复文件合并到dir2
dir1
busybox,然后使用diff -q
进行 linewise 比较将是一种有效的解决方案。 (你也可以以类似的方式使用cmp
,但它的逐字节比较可能会慢一点。)
比较将需要一个强制逐个文件比较来比较然后移动文件而不受数组的好处。将dir1
和dir2
作为脚本参数的简短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
。
如果您还有其他问题,请与我们联系。