抱歉这个糟糕的标题。我正在尝试做的事情如下。我有一个目录,其中包含(比如说)1000 个文件,其名称格式为Foo_bar_1,...,Foo_bar_1000
.我想从每个文件名中删除“栏”。对于单个文件,这很容易,例如:mv Foo_bar_1 Foo_1
.
显然我可以使用循环以这种方式处理所有文件。但是,我想知道是否有一种简单的方法可以使用mv
正则表达式命令在不循环的情况下执行此操作。我可以将任何源文件与表达式匹配Foo_bar_*
。现在有什么方法可以“访问”与 匹配的文本吗*
?
我想写的是类似的东西mv Foo_bar_* Foo_*
,其中目标文件中的第二个*
应该等于*
源文件中匹配的字符串。如何才能做到这一点?
答案1
通配符由您的 shell 扩展前命令运行。所以这将被执行:
mv Foo_bar_1 Foo_bar_2 ... Foo_bar_1000 Foo_bar_1 Foo_bar_2 ... Foo_bar_1000
或者,如果您有类似 的文件Foo_foo_1
,它们也会被添加,因为它们与第二个通配符匹配。
所以不,这是不可能的。
此外,mv
只接受单个目标。
你可以做一个for
循环:
for f in *; do mv "$f" "${f/_bar_/_}"; done
或使用一些批量重命名工具:
Perl重命名工具:
rename 's/_bar_/_/' *
“正常”重命名工具:
rename '_bar_' '_' *
也可以看看: