【问题标题】:Rename/move (mv) multiple files starting with name重命名/移动(mv)以名称开头的多个文件
【发布时间】:2018-02-28 08:13:27
【问题描述】:

我正在尝试重命名与一个目录中的模式匹配的多个文件。

文件:

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.'

在 Bash 中使用 for 循环

# 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

但是,这些都不起作用。

【问题讨论】:

标签: bash rename file-rename


【解决方案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 shell bash 而不是上述解决方案可移植的 POSIX bourne shell (sh),您可以使用特殊的 globbing 选项来避免当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

【讨论】:

    【解决方案2】:

    半通用实用程序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 模式匹配

    * 是 Bash 使用的通配符,但它被引号转义为 传递给mmv_# 是对匹配项的引用,也被转义了 (尽管文档建议 #1 可以代替)。

    这一系列命令对于复制 (cp) 和链接也很方便 (ln)。


    如果您碰巧拥有 Zsh(一种常见的 Bash 升级/替换),那么您已经 已经得到zmv,它同样可以完成这项工作:

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

    【讨论】:

      猜你喜欢
      • 2018-06-18
      • 2010-11-19
      • 2014-12-22
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 2015-12-11
      相关资源
      最近更新 更多