Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在find命令上转义-exec?_Linux_Bash_Shell - Fatal编程技术网

Linux 如何在find命令上转义-exec?

Linux 如何在find命令上转义-exec?,linux,bash,shell,Linux,Bash,Shell,我的硬盘上有一个重复文件列表。 我很难检查文件是否不在列表中。 格雷普 工作。但是我无法让它在find命令的-exec部分工作 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:

我的硬盘上有一个重复文件列表。 我很难检查文件是否不在列表中。 格雷普

工作。但是我无法让它在find命令的-exec部分工作

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 ...
有人知道逃生顺序正确吗? 或者是一个不同的想法?

为什么不简单

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,因此我们传入一个伪占位符值。

首先,我将使用-q grep选项,不必担心流重定向。此外,我会考虑使用FGRIP或GRIP-F代替GRIP和-X选项来匹配整个普通字符串而不是正则表达式。最后,我会避免贝壳管道

生成的命令应如下所示:

find /path/to/dir -type f -exec grep -v -q -x -F {} /path/to/duplicates.txt  \; -print
或者类似的东西,取决于你的需要

-exec接受单个命令及其参数。>/dev/null不是参数,而是shell在运行grep之前处理的重定向。类似地,| |不是参数,而是一个shell操作符,用于根据grep的退出状态确定是否运行echo。要回答您的确切问题,您需要将命令列表作为参数传递给sh-c


如果您的目标是查找重复的文件,即具有相同内容的文件,而不依赖于它们的名称,我将以不同的方式处理

我会首先为每个文件计算一个校验和,可能只是简单地使用md5sum,然后根据它们的校验和对它们进行排序,例如

find 250G_EXT4/ -type f -exec md5sum '{}' \;   \
  | sort > /tmp/md5sumlist.txt

然后,我将处理那些具有相同md5校验和的少数条目,并使用cmp来比较它们的内容。

尽管也可能是-x,它指定匹配整行;否则,a.c也与bodega.c匹配,但find的输出将包含一个路径组件,该组件可能不在文件中。+1;很高兴知道如何将额外的参数传递给sh-c,并注意到相关的$0陷阱——尽管您总是可以直接在命令字符串中使用{}。还没有完全掌握sh的用法,但一分钟后它似乎就可以理解了。谢谢你的解决方案-exec接受单个命令及其参数;不能包含重定向,重定向由shell处理,未传递给exec系统调用,或| |,这是一个用于条件执行的shell运算符。您的文件路径是否包含空格或其他顽皮的字符?它确实包含空格,并且在文件名(如UMLAUTS)中可以找到其他顽皮的东西。这将查找文件中的条目,可能你的答案更好,尤其是在整个find输出中只运行一次grep。但在某些情况下,文件名可能包含错误字符。不确定我们的两个答案是否都能正确处理它们。grep无论如何都是面向行的,因此如果文件名包含换行符,+1,这就不起作用,但是您应该双引号引用{}实例,以保护它们不受shell扩展的影响。请注意,这仅在与sh-c一起使用的命令字符串中是必需的,而不是在将{}用作直接的单独参数时。处理是个问题。
find 250G_EXT4/ -type f \
  -exec sh -c 'grep "{}" duplicates_sorted.txt > /dev/null || echo "{}"' \;
find 250G_EXT4/ -type f -exec md5sum '{}' \;   \
  | sort > /tmp/md5sumlist.txt