linux - grep 命令在 testdir 中工作但不在 "real"目录中

标签 linux grep filenames

我以为我找到了解决方案,因为该命令在我的测试目录中有效。

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

但是使用非测试目录中的命令该命令不起作用: 这是错误消息:

grep: unknown option -- O
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

Not even this worked:

$ grep -H author *.xml

或者这个:

$ grep -H 'author' *.xml

(同样的错误信息)

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

更多信息:

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

最佳答案

试试这个(更新):

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

解释(更新)

  • 在您的“真实”目录中,您有一个名称以 -O 开头的文件。 您的 shell 扩展了文件列表 *.xml 并且 grep 将您的 - 起始文件名作为一个选项(无效)。 mv 也会发生同样的事情。如 info coreutilsCommon options 部分所述,您可以使用 -- 来分隔选项列表。 -- 之后的内容被视为操作数,而不是选项。

  • 使用 -l(小写 L)选项,grep 仅输出匹配文件的文件名,因此您不需要使用 剪切

  • 要正确处理每个奇怪的文件名,您必须在 grep 中使用 -Z 对,在 中使用 -0 >xargs.

  • 无需使用 -e,因为您的模式不是以 - 开头。

希望这会有所帮助!

关于linux - grep 命令在 testdir 中工作但不在 "real"目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3255918/

相关文章:

linux - QT可以打开一个Linux终端然后写入吗?

linux - Linux 上的 Azure Web App - 服务器修补

linux - 如何使用 bash 脚本替换文件名中的空格

perl - 如何在 Perl 中更改文件名的大小写?

objective-c - NSCoder 二进制文件格式应应用什么文件扩展名?

python - 使用 python 程序(理想情况下)将 Ubuntu 源中的 mp3 文件流式传输到 Raspberry Pi

python - 我有一些编号的列表(CSV)。与某些 zip 文件名相同。我只想解压那些特定的 zip 文件

linux - 如何在 Unix 中将数据拆分为两条新记录?

Linux:在用户已准备好输入名称的文本文件中搜索字符串

multithreading - 如何快速杀死运行特定脚本的所有线程?