我试图仅使用将文件子集从一个目录复制到另一个目录,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
很酷哈哈!!