【问题标题】:bash scripting - selectively handle file names with spacesbash 脚本 - 有选择地处理带空格的文件名
【发布时间】:2011-04-09 05:03:20
【问题描述】:

我有一个目录,文件名为“a b c.jpg”、“d e f 0.jpg”、“g h i.jpg”

我需要一个脚本让所有以“0.jpg”结尾的文件变成“_0.jpg”

所以,在上面的例子中,第二个文件应该变成“d e f_0.jpg”

【问题讨论】:

    标签: bash filenames spaces


    【解决方案1】:

    rename 工具可能正是您所需要的。

    【讨论】:

    • 这是 MySQL 的一部分,因此可能无法安装。此外,它适用于内容而不是文件名。
    【解决方案2】:

    我认为您的问题应该是您希望以“0.jpg”结尾的文件变为“_0.jpg”(注意第一个引号中的空格)。你的例子是有道理的。

    for i in *\ 0.jpg ; do
        mv -- "$i" "${i/ 0.jpg/_0.jpg}"
    done
    

    也就是说,对于每个匹配模式“* 0.jpg”的文件,将其重命名为“0.jpg”替换为“_0.jpg”

    编辑:为了增加安全性,请考虑使用-n(禁止破坏)或-i(交互式)作为mv(1) 的选项。

    【讨论】:

    • 很好的解决方案,+1。你可能想写mv -- "$i" 来保护以破折号开头的文件名。
    • 好点。由于我们使用的是 bash,我们可能有 GNU mv。已添加。
    • 嗨,请解释一下您在这里使用的是哪种技术?我不明白。 "${i/0.jpg/_0.jpg}"
    【解决方案3】:
    ls -1 | grep .jpg | awk -F "." '{print $1 "_0." $2}'
    

    【讨论】:

    • 这值得至少三票反对。切勿在脚本中使用ls,切勿使用grep 匹配文件名,如果有更简单的内置解决方案,请不要使用外部工具。
    • 更糟糕的是:这实际上并没有重命名任何东西,它只是打印一个新名称列表。它不会将“0”替换为“_0”,而是添加“_0”。它对所有 .jpg 文件执行此操作,而不仅仅是那些以“0.jpg”结尾的文件。如果任何文件名中包含额外的句点字符,它就会变得更加愚蠢。
    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多