查找grep排除dos2unix的某些文件名

查找grep排除dos2unix的某些文件名,grep,find,dos2unix,Grep,Find,Dos2unix,到目前为止,我已经做到了这一点: prompt$ find path/to/project -type f | grep -v '*.ori|*.pte|*.uh|*.mna' | xargs dos2unix 2> log.txt 但是,扩展名为.ori、.pte、.uh和.mna的文件仍然会出现。最好将排除留在查找中,请参见Birei的答案 您的grep模式的问题是您将其指定为shell glob。默认情况下,grep期望基本正则表达式(BRE)作为其第一个参数。因此,如果您将gre

到目前为止,我已经做到了这一点:

prompt$ find path/to/project -type f | grep -v '*.ori|*.pte|*.uh|*.mna' | xargs dos2unix 2> log.txt

但是,扩展名为.ori、.pte、.uh和.mna的文件仍然会出现。

最好将排除留在
查找中,请参见Birei的答案

您的
grep
模式的问题是您将其指定为shell glob。默认情况下,
grep
期望基本正则表达式(BRE)作为其第一个参数。因此,如果您将grep模式替换为:
*\。\(ori\|pte\|uh\|mna\)$
,它应该可以工作。或者,如果希望使用扩展正则表达式(ERE),可以使用
-E
启用它们。然后您可以这样表示相同的排除:
*\(ori | pte | uh | mna)$

完整命令行:

find . -type f | grep -vE '.*\.(ori|pte|uh|mna)$'
单向:

find path/to/project *.* -type f ! \( -name '*.ori' -o -name '*.pte' -o -name '*.uh' -o -name '*.mna' \) 
  | xargs dos2unix 2> log.txt

这些都没用,我想知道为什么。grep不是只做文件名吗?@Sassinak:你到底运行了什么命令?所有
grep
看到的都是
find
列出的文件名,如果其中没有包含换行符,则每行一个。因此,不存在“仅文件名”依赖关系。顺便说一句,您希望匹配行尾,因此模式应该以
$
锚定,我将把它添加到答案中。好的,添加了更改,它工作得非常好。我更喜欢这个,因为它“更短”,但上面的答案也适用。谢谢