【问题标题】:Unix Renaming Files [closed]Unix重命名文件[关闭]
【发布时间】:2017-08-15 19:55:44
【问题描述】:

我想在 UNIX 上使用脚本重命名文件夹中的文件。
原文件格式为:

abc.txt.temp

我想将其重命名为:

abc.txt

许多文件使用这种格式,我想从原始文件名中删除 .temp

【问题讨论】:

  • 显示which prename输出
  • 您可能想要使用mmv 工具:mmv "*.txt.temp" "#1.txt"
  • 不是重复的,因为问题想要替换/删除文件名的一部分而不是重命名。此外,这不是题外话,因为它明确要求 bash 脚本 来执行此操作...

标签: linux bash shell unix


【解决方案1】:

Ciprian 给出的答案当然是一个选项,但我觉得它有局限性。 下面的解决方案更加灵活,因为您不必实际计算任何内容,并且可以从任何位置删除文本,而不仅仅是末尾。

以下命令(1 行)将删除所有文件中对 .temp 的任何提及:

for filename in *; do mv "$filename" "${filename//.temp/}"; done

注意 “*”表示当前文件夹中的所有文件。您可以使用 *.temp 来获得与 Ciprian 方法完全相同的结果。 (即仅从以 .temp 结尾的文件中删除 .temp)

【讨论】:

  • 工作正常。我能够快速重命名一堆文件。在 1 班轮中!!
  • 很高兴我能帮上忙!我自己经常使用这个命令,并且总是得到我正在寻找的结果:) 考虑将我的答案标记为“已接受”,这样它将显示在顶部,以便其他人可以更快地找到答案。
  • $* 中的文件名;做 mv "$filename" "${filename//.temp/}";这工作正常。但是,如果我想重命名 100 个文件并且只重命名特定日期的文件,这将变得乏味。有没有一种方法我只通过脚本作为参数传递日期,它只重命名该日期的文件,而无需我传递文件名
【解决方案2】:

我不了解 UNIX,但由于该问题也有 Linux 标签,因此可能只是 UNIX/Linux 混淆。

大多数 GNU/Linux 发行版都有一个rename 命令。根据rename 版本,在files 名称中将foo 替换为bar,语法可能很简单

rename foo bar files

或遵循sed 的正则表达式语法:

rename 's/foo/bar/' files

在您的情况下,您希望在所有以 .temp 结尾的文件中将 .temp 替换为空字符串 (''),因此根据您的 rename 版本,这些命令之一应该可以工作:

rename .temp '' *.temp

rename 's/\.temp$//' *.temp

【讨论】:

    【解决方案3】:

    使用类似“rename.sh”的名称创建以下脚本:

    #!/bin/bash
    
    TARGET_DIR=$1
    TARGET_FILES="$TARGET_DIR/*.temp"
    
    for fileName in $TARGET_FILES
    do
        newFileName=${fileName::-5}
        mv -v "${fileName}" "${newFileName}"
    done
    

    注意${var:offset:length} 扩展需要 bash 版本 4 或更高版本。

    赋予它执行权:

    chmod a+x rename.sh
    

    您需要调用它并将 .temp 文件的目录名称作为参数传递。像这样称呼它:

    ./rename.sh /path/to/the/temp-files
    

    脚本循环遍历目标文件夹中的所有 *.temp 文件,从文件路径中提取最后 5 个字符('.temp' 为 5 个字符)并将原始文件移动到不包含的新文件中.temp 作为扩展名。

    编辑:在 CentOS 7 上测试

    【讨论】:

    • 子字符串表达式
    • @Ritesh,我在 mv 命令中添加了详细模式。请修改脚本并再次运行。注意 mv 命令的 -v 选项。之后,请显示输出。我怀疑是文件名问题,但我们需要看看到底是哪个。
    • 可能与::- :)有关
    • @RickvanLieshout, ::- 在我测试的 CentOS 7 上运行良好。 ;-)
    • @RickvanLieshout,你赢了!你的解决方案确实比我的灵活得多(更不用说它的可读性了)。所以,请给我一个+1。感谢您建议我的帖子需要编辑和改进。你绝对是对的,但我更愿意让它保持原样(贫穷和不灵活),以便后代学习如何不回答关于 SO 的问题。干杯;-)