2017-09-19 158 views
3

我试图重命名与一个目录中的模式相匹配的多个文件。重命名/移动(mv)以名称开头的多个文件

文件:

stack_overflow_one.xml 
stack_overflow_two.xml 
stack_overflow_one.html 

我想改名stack_overflowheap_graph

heap_graph_one.xml 
heap_graph_two.xml 
heap_graph_one.html 

我曾尝试以下:

使用rename

rename stack_overflow heap_graph stack_overflow* # returns 'The syntax of the command is incorrect.' 

在猛砸

# how can I write this in one line? I've tried wrapping in one line, but also does not work 
for i in stack_overflow* do 
    mv "$i" "${i/stack_overflow/heap_graph}" 
done 

但是使用for循环,都未工作。

+1

有许多不同的在我的PC上执行'rename',支持不同的sintaxes - 语法是'rename s/stack_overflow/heap_graph/stack_overflow *' – gboffi

+1

在for循环中使用分号将它写在一行上:'for foo in bar;做一点事;完成' –

+0

如果您发现任何给定的答案是有用的,请参阅[我应该怎么做当有人回答我的问题?](https://stackoverflow.com/help/someone-answers)和[这是什么意思当答案是“接受”?](https://stackoverflow.com/help/accepted-answer) – Inian

回答

1

你在for循环中有一个微不足道的语法错误。脚本的其余部分应该可以正常工作,没有任何问题。

for i in stack_overflow*; do 
#      ^^^ missing semi-colon 
# The below condition to handle graceful loop termination when no files are found 
    [ -f "$i" ] || continue 
    mv "$i" "${i/stack_overflow/heap_graph}" 
done 

正如下面ghoti指出,如果你是在Bourne Again Shell的bash,而不是POSIX的Bourne shell(sh)针对上面的解决方案是可移植的,你可以使用特殊的通配选项来避免必须处理glob没有文件返回的情况。

shopt -s nullglob 
for i in stack_overflow*; do 
    mv "$i" "${i/stack_overflow/heap_graph}" 
done 

shopt -u nullglob 

-s选项设置,并-u取消设置它。更多关于shopt内置从GNU bash page

0

半常见的实用工具mmvarticle) 是你所描述的“多动”的情况下非常有用。

$ mmv -n 'stack_overflow_*' 'heap_graph__#' # remove -n after testing 
mv -- stack_overflow_one.html heap_graph_one.html 
mv -- stack_overflow_one.xml heap_graph_one.xml 
mv -- stack_overflow_two.xml heap_graph_two.xml 

正如你所看到的,它只是打电话到mv多次为 模式(S)匹配

*是Bash使用的通配符,但它的引用转义为 传递给mmv_#是对比赛的参考,也逃脱了 (虽然文档暗示#1会起作用)。

该系列命令也适用于复制(cp)和链接 (ln)。


如果你碰巧有岩组(共同猛砸升级/更换),你 已经有了zmv,这将同样做的工作:

% zmv -n 'stack_overflow_(*)' 'heap_graph_$1'