我的硬盘上有重复文件列表。 我很难检查列表中是否有文件。 Grepping
grep $1 $2 > /dev/null || echo $1
的工作原理。但我不能让它在find命令的-exec-Part中工作。
find 250G_EXT4/ -type f -exec grep "{}" duplicates_sorted.txt \> /dev/null \|\| echo {} \;
消息是
grep: >: Datei oder Verzeichnis nicht gefunden (File or directory not found)
grep: ||: Datei oder Verzeichnis nicht gefunden ...
grep: echo: Datei oder Verzeichnis nicht gefunden ...
有没有人知道逃脱序列是否合适? 或者可能有不同的想法?
答案 0 :(得分:5)
为什么不简单
find | grep -vFf duplicates_sorted.txt -
这也应该快得多。
(-F
标志指定文字匹配,即没有正则表达式匹配。否则a.c
将匹配abc
等。)
find -exec
只需一个命令;单个命令可以是传递给它的任意复杂脚本的shell:
find -exec sh -c 'grep -q "$1" file || echo "$1"' dummy {} \;
sh -c
的第一个参数用作$0
,因此我们传入一个虚拟的占位符值。
答案 1 :(得分:3)
-exec
接受一个命令及其参数。 > /dev/null
不是参数,而是shell在运行grep
之前处理的重定向。同样,||
不是参数,而是用于确定是否运行echo
的shell运算符,具体取决于grep
的退出状态。要回答您的确切问题,您需要将命令列表作为参数传递给sh -c
。
find 250G_EXT4/ -type f \
-exec sh -c 'grep "{}" duplicates_sorted.txt > /dev/null || echo "{}"' \;
答案 2 :(得分:0)
首先,我会使用-q
grep选项,并且不会因为流重定向而烦恼自己。另外,我会考虑使用fgrep
(或grep -F
)而不是grep
,并使用-x
选项来匹配整个普通字符串而非正则表达式。最后我会避免外壳管道。
结果命令应如下所示:
find /path/to/dir -type f -exec grep -v -q -x -F {} /path/to/duplicates.txt \; -print
或类似的东西,取决于您的需求。
答案 3 :(得分:0)
如果您的目标是找到重复的文件(即具有相同内容的文件,与其名称无关),我会采用不同的方式。
我首先为每个文件计算一个校验和,可能只是md5sum
,然后按校验和对它们进行排序,例如。
find 250G_EXT4/ -type f -exec md5sum '{}' \; \
| sort > /tmp/md5sumlist.txt
然后我会处理那些具有相同md5校验和的少数条目,并使用cmp
来比较它们的内容。