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


22

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

Answers:


29

没有。

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/ \;

这表示要在当前目录中递归搜索路径中不包含“ .php”的文件,然后将其复制到中/destination/folder/

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

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

编写与“不包含”的字符串匹配的正则表达式是相当困难的.php,因此我们改为告诉find搜索确实包含的字符串,.php然后使用反转结果!


2
find . -name [^\.php] -exec cp {} /path/to/location \;注意带有特殊字符的文件。
罗布(Rob)2012年

@Darth Android-谢谢。我不知道cp其他二进制文件无法扩展正则表达式。您介意在给出的示例示例中详细说明每个选项和参数的含义吗?我知道,.指的是当前目录,但什么!{}\;,等指,以及他们是什么意思?例如,为什么您必须逃脱;
PeanutsMonkey 2012年

@Rob-特殊文件是什么意思?
PeanutsMonkey 2012年

@Rob-我试图用类似的表达式删除特定文件,但是最终删除了目录中的所有文件。find . -name '[^\.txt]' -exec rm {} \;因此,我的命令是我不愿使用find。我可能是一个错误,但不确定我做错了什么。据我了解{},该命令所找到的每个文件find . -name '[^\.txt]'
PeanutsMonkey 2012年

您想与正则表达式匹配什么?
罗布

10

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

ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder

如何{}给不同-t
PeanutsMonkey 2012年

2
在这种情况下不多。xargs的替代语法为“ xargs cp {} destination_folder”。标准cp语法最后使用一个或多个源,最后一个目标,使用-t选项时,可以在-t之后指定目标,然后将其余行用作源。在这种情况下,我只是觉得-t选项更方便。在另一个示例中,{}被替换为通过管道传递给xargs(stdin)的文件,在本例中为文件名。
0xAF 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.