【问题标题】:Renaming multiple files using parameter unix使用参数 unix 重命名多个文件
【发布时间】:2016-10-20 17:55:35
【问题描述】:

我在rename.sh 下方有一个重命名脚本。我想引入a variable,这样我就可以在执行脚本时传递一个日期参数,例如
./rename.sh 20151103
这样20151103 在脚本中替换20140306

for f in *.CDR*; do
  echo mv "$f" "${f/-20140306/-0-20140306}"
done

考虑自动执行此操作,因为我不想在每次重命名时手动编辑脚本。任何其他方法都将受到高度欢迎。

【问题讨论】:

  • TS=$1 和 `mv "$f" "$TS" 有什么问题?
  • @GMichael 那不会做他想做的事。

标签: unix rename


【解决方案1】:

这是您可以考虑的一种方法:

#!/bin/bash

input=$1

for f in *.CDR*; do
  echo mv "$f" "${f/-$input/-0-$input}"
done

【讨论】:

    【解决方案2】:
    #!/bin/bash
    
    pattern="$1"
    
    for f in *.CDR*; do
        echo mv "$f" "${f/-${pattern}/-0-${pattern}}"
    done
    

    解释:

    • #!-line 表示我们将其作为 bash 脚本运行。

    • 脚本将使用命令行上传递给它的参数填充变量$1$2 等。这些称为位置参数$0 通常包含脚本的名称)。

    • 我们采用$1,因为我们知道它应该包含我们要替换的模式,并将其分配给变量$pattern。在更复杂的脚本中,这里是我们处理命令行开关的地方(使用getopts,但这是另一天的答案)。

    • 我们引用$1,只是因为。 (引用用户输入是一种很好的做法,以确保不会扩展 shell 通配符,例如 *)。

    • 剩下的就是你之前的脚本,但字符串 20140306 替换为 ${pattern}。我在这里使用${pattern} 而不是$pattern 只是为了便于阅读。通常,如果您需要使用${a} 而不是$a,例如,插入一个类似"${a}nospaceafter" 的字符串。

    那么在测试它之前应该只是让脚本可执行:

    $ chmod +x rename.sh
    

    【讨论】:

    • 你完全杀了它。我明白谢谢。让我坐下来,我相信我会有更多问题要问。
    • 我像你之前建议的那样创建了一个目录renamed,里面有要重命名的文件和脚本。我使用./rename.sh 20160611 运行脚本并收到一条消息/usr/bin/bash: bad interpreter: No such file or directory。我想我错过了什么。
    • @oak 这意味着脚本的第一行 (#!...) 在您的系统上指向 bash 的路径错误。使用which bash 命令查看它应该是什么并重写该行。
    • @oak 应该是#!/bin/bash
    • 你是对的。之前没有注意到。有效。我有另一个问题,但让我先确认一下。我真的很喜欢这个。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    相关资源
    最近更新 更多