我需要将具有特定文件名字符串的所有图像移动到特定目录。
这是一个示例文件名
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'.