如何在包含特定字符串的路径之外查找具有特定扩展名的文件,然后将结果打印到文件?

如何在包含特定字符串的路径之外查找具有特定扩展名的文件,然后将结果打印到文件?

经过一番搜索,我想出了这个命令:

> find . -type f \( -name "*.exe" \) | egrep -v
> 'games_1|rei|games|tor|jogos|mods|text' > 1

我想要做的是查找带有 .exe 扩展名的文件,除了包含任何这些字符串的路径,然后将结果打印到名为“1”的文件中,我将其写入可执行文件。

但是,在终端中执行时,出现以下错误,并且什么也没做:

find: ‘./NUNO-PC/Disco_2TB_120323/Downloads_070321/My Web Sites/wdsdeewre/2.bp.blogspot.com’: Input/output error
find: ‘./NUNO-PC/Disco_2TB_120323/Downloads_070321/My Web Sites/wdsdeewre/segredoh.blogspot.com/feeds’: Input/output error
find: ‘./NUNO-PC/Disco_2TB_120323/Downloads_070321/My Web Sites/wdsdeewre/4.bp.blogspot.com’: Input/output error
find: ‘./NUNO-PC/Disco_2TB_120323/Downloads_070321/My Web Sites/wdsdeewre/3.bp.blogspot.com/-ux8HFQj0iuE/WQ9ywGiPXOI’: Input/output error
grep: write error: Input/output error
./encontrarsoft: error reading input file: Invalid argument

我错过了什么?

答案1

您显示的错误实际上毫无意义,因为看起来 grep 正在尝试读取文件,但您的命令不会导致这种情况。无论如何,这些错误与磁盘上有问题的文件/扇区有关,而不是您的命令,而且您也不需要, grep所以我们可以避免这种情况。顺便说一句,不要使用,egrep因为它已经过时了,grep -E而是使用。

以下是如何使用单个find命令完成您想要的操作:

find . -type f -name '*.exe' \
  -not -regex '.*\(games_1\|rei\|games\|tor\|jogos\|mods\|text\).*'

这将查找名称以 结尾.exe且其整个路径(包括名称)与任何提到的字符串都不匹配的文件。 find 的默认正则表达式语言是 Emacs 正则表达式,在这些语言中,您需要转义和,( )|使它们分别具有分组和或的特殊含义。或者,您可以告诉find样式egrep化正则表达式并简化为:

find . -regextype egrep -type f -name '*.exe'  \
  -not -regex '.*(games_1|rei|games|tor|jogos|mods|text).*'

(请注意,\这里只是为了换行以避免水平滚动;命令可以直接按原样复制/粘贴到终端中,但您也可以在一行上完成整个操作。)

相关内容