如何在find-command上转义-exec?

时间:2014-04-27 13:38:23

标签: linux bash shell

我的硬盘上有重复文件列表。 我很难检查列表中是否有文件。 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 ...

有没有人知道逃脱序列是否合适? 或者可能有不同的想法?

4 个答案:

答案 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来比较它们的内容。