如何在 Linux 中将正则表达式与 cp 命令结合使用?

如何在 Linux 中将正则表达式与 cp 命令结合使用?

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

答案1

不。

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

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/

根据要求,更具体地分析论点:

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

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

答案2

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

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

答案3

要将 100 个日志文件复制到同一目录的另一个 log2 文件夹中,我使用以下命令

cp 应用程序.log.[0-9][0-9] log2

答案4

您可以运行以下命令轻松使用:

find /home/usr/search_dir -iname *file_name_portion*.txt | xargs cp -t /home/usr/destination_folder

很酷哈哈!!

相关内容