重命名/移动(mv)以名称开头的多个文件
问题描述:
我试图重命名与一个目录中的模式相匹配的多个文件。重命名/移动(mv)以名称开头的多个文件
文件:
stack_overflow_one.xml
stack_overflow_two.xml
stack_overflow_one.html
我想改名stack_overflow
到heap_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
循环,都未工作。
答
你在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
答
半常见的实用工具mmv (article) 是你所描述的“多动”的情况下非常有用。
$ 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'
有许多不同的在我的PC上执行'rename',支持不同的sintaxes - 语法是'rename s/stack_overflow/heap_graph/stack_overflow *' – gboffi
在for循环中使用分号将它写在一行上:'for foo in bar;做一点事;完成' –
如果您发现任何给定的答案是有用的,请参阅[我应该怎么做当有人回答我的问题?](https://stackoverflow.com/help/someone-answers)和[这是什么意思当答案是“接受”?](https://stackoverflow.com/help/accepted-answer) – Inian