grep命令在testdir中工作,但不在“真实”目录中

我只是以为我find了我的解决scheme,因为该命令在我的testing目录中工作。

grep -H -e 'author="[^"].*' *.xml | cut -d: -f1 | xargs -I '{}' mv {} mydir/. 

但是在非test-direcory中使用该命令不起作用:这是错误消息:

 grep:未知选项 -  O
用法:grep [OPTION] ... PATTERN [FILE] ...
尝试`grep --help'获取更多信息。

甚至没有这个工作:

 $ grep -H author *.xml 

或这个:

 $ grep -H 'author' *.xml 

(同样的错误信息)

我怀疑它与文件名或文件的数量有一些关系。 我在非testing目录中有将近3000个文件,而在我的testing目录中只有20个。 在这两个目录中几乎所有文件名都包含空格和“ – ”。

一些更多信息:

  • 我正在使用Cygwin。
  • 我不允许更改文件名

试试这个(更新):

 grep -HlZ 'author="[^"].*' -- *.xml | xargs -0 -I {} mv -- {} mydir/ 

说明 (更新)

  • 在你的“真实”目录中,你有一个名字以-O开头的文件。 你的shell扩展文件列表*.xmlgrep把你的起始文件名作为一个选项(无效)。 同样的事情发生在mv 。 正如在info coreutilsCommon options部分中所解释的那样,您可以使用--分隔选项列表。 什么之后--被认为是一个操作数,而不是一个选项。

  • 使用-l (小写的L)选项, grep只输出匹配文件的文件名,所以你不需要使用cut

  • 要正确处理每一个奇怪的文件名,你必须在grep使用-Z ,在xargs使用-0

  • 不需要使用-e因为你的模式不以-开头。

希望这会有所帮助!