在 Linux 中如何通过 cp 命令使用正则表达式?

Pea*_*key 24 linux cp

我试图只将文件的一个子集从一个目录复制到另一个目录,cp但是我收到了消息cp: cannot stat [^\.php]': No such file or directory。有没有办法只使用cp命令来使用正则表达式?

Dar*_*oid 33

不。

cp命令不具备将其任何参数作为正则表达式处理的能力。它甚至不处理通配符(或大多数可执行文件);相反,它们由外壳处理。

cp test/* test2/实际上是由 bash 扩展的,并且cp它的参数真正看到的是cp test/file1 test/file2 test/file3 test2/(或任何基于 的实际内容的适当内容test/)。

另外,我认为您的表达式 ,[^\.php]不会匹配您想要的内容(它不只匹配包含 的文件.php)。

您可能希望查看该find实用程序以根据正则表达式过滤出文件列表,然后使用xargs将返回的文件列表应用于cp命令(假设 find 没有用于复制文件的内置处理程序;我我对这个工具不是很熟悉)。

你可以试试:

find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;
Run Code Online (Sandbox Code Playgroud)

这表示递归搜索当前目录中路径中不包含“.php”的文件并将它们复制到 .php 文件中/destination/folder/

根据要求,对参数进行更具体的细分:

  • . - 开始搜索的位置 - 在这种情况下,当前目录
  • ! - “非”运算符,反转下一个测试的结果
  • -iregex- 不区分大小写的正则表达式测试。下一个参数是表达式。
  • ".*\.php.*"- 正则表达式匹配<Anything>.php<Anything>- 路径中某处包含“.php”的任何文件。(注意,包括在名称中包含“.php”的文件夹中,您需要一个更复杂的表达式来仅匹配文件)
  • -exec- 如果前面的测试返回 true,则执行命令。下一个参数是命令,所有剩余的参数;都传递给命令。the{}是一个表示文件名的特殊参数。
  • cp - find` 应该在每个匹配的路径名上运行的命令。
  • {}- 找到的文件的路径,cp作为参数传递给它,以便它知道要复制哪个文件
  • /destination/folder/- 参数传递给cp,告诉cp它应该将文件复制到哪里。
  • \;- 这是正在寻找的;终结者-exec。我们用 a 对其进行转义,\这样您的 shell 就不会尝试解析它,而是将其作为参数提供给命令 ( find)

编写一个匹配“没有的字符串”的正则表达式是相当困难的.php,所以我们告诉find搜索确实包含的字符串,.php然后用!.

  • `找到。-name [^\.php] -exec cp {} /path/to/location \;` 注意带有特殊字符的文件。 (2认同)

0xA*_*xAF 10

您可以从控制台使用一些其他工具,例如 grep 和 xargs。

ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下并不多。xargs 的替代语法是“xargs cp {} destination_folder”。标准 cp 语法最终采用一个或多个源和一个目标,当您使用 -t 选项时,您可以在 -t 之后指定目标,然后使用该行的其余部分作为源。我只是发现在这种情况下 -t 选项更方便。在另一个示例中,{} 替换为通过管道传输到 xargs (stdin) 的内容,在本例中为文件名。 (2认同)