如何在使用 ls 识别文件后移动文件 | egrep ,或“egrep”与“查找”

如何在使用 ls 识别文件后移动文件 | egrep ,或“egrep”与“查找”

我需要将具有特定文件名字符串的所有图像移动到特定目录。

这是一个示例文件名

facility_92+SOURCE1+SOURCE1.0

“facility_”后面可以有 1 到 5 位数字。

以下将返回我想要移动的文件列表:

ls | egrep "facility_([0-9]*)\+SOURCE[0-9]*"

然而,当我试图移动返回的任何东西时,我陷入了困境。我尝试使用 find 将匹配的文件移动到移动的文件夹:

for f in 'find ./ | ls | egrep "facility_([0-9]*)\+SOURCE[0-9]*"'; do mv $f moved/; done

但是当 mv 将条件解析为字符串时,我遇到了许多错误......

我又尝试了“-exec”:

find ./ | ls | egrep "facility_([0-9]*)\+SOURCE[0-9]*" -exec mv moved 

但收到类似的错误...

感谢建议。我尝试这种方法有错吗?我应该弄清楚如何在“查找”中执行相同的正则表达式吗?

答案1

find你应该不是通过管道连接命令。

它有一个很好的-regex标志,您可以将文件名匹配字符串传递给它:

find . -regextype egrep -regex ".*facility_([0-9]*)\+SOURCE[0-9]*.*" -exec mv {} DIRECTORY \;

最后\;将每个匹配的文件名传递到mv来代替{}.

正如您所看到的,您需要.*在正则表达式的开头和结尾使用,因为find需要对所有的小路:

-regex pattern
       File name matches regular expression pattern.  This is a match on the whole path, not a search. For  example, to  match  a  file named './fubar3', you can use the regular expression '.*bar.' or '.*b.*3', but not 'f.*r3'.

相关内容