【问题标题】:Removing last n characters from Unix Filename before the extension在扩展名之前从 Unix 文件名中删除最后 n 个字符
【发布时间】:2013-07-10 04:41:48
【问题描述】:

我在 Unix 目录中有一堆文件:

  test_XXXXX.txt  
  best_YYY.txt   
  nest_ZZZZZZZZZ.txt

我需要将这些文件重命名为

  test.txt   
  best.txt   
  nest.txt

我在 AIX 上使用 Ksh。请告诉我如何使用单个命令完成上述操作。

谢谢,

【问题讨论】:

    标签: file-rename


    【解决方案1】:

    如果这是一次(或不经常)的场合,我会创建一个脚本

    $ ls > rename.sh
    $ vi rename.sh
    :%s/\(.*\)/mv \1 \1/
    (edit manually to remove all the XXXXX from the second file names)
    :x
    $ source rename.sh
    

    如果这种需求经常发生,我需要更深入地了解 XXXXX、YYY 和 ZZZZZZZZZZ 是什么。


    附录

    根据自己的喜好修改:

    ls | sed "{s/\(.*\)\(............\)\.txt$/mv \1\2.txt \1.txt/}" | sh
    

    它通过省略 .txt 之前的 12 个字符并将生成的 mv 命令传递给 shell 来转换文件名。

    注意:如果有不匹配的文件名,它会执行文件名,而不是mv 命令。我省略了只选择匹配文件名的方法。

    【讨论】:

    • 让我这样说:删除文件名中 .txt 之前的最后 12 个字符。
    • 我可能在想如何对 Extension .txt 之前的最后 n 个字符执行此操作,其中 n 是可变的。但具体来说,它是最后 12 个字符。这也必须经常这样做。
    • @user2417881:我已经修改了我的答案。请注意,它的范围有限。
    【解决方案2】:

    在这种情况下,您似乎有一个_ 来开始您要删除的每个部分。如果是这样的话,那么这应该可以工作:

    for f in *.txt
    do
      g="${f%%_*}.txt"
      echo mv "${f}" "${g}"
    done
    

    如果输出看起来正确,请删除echo,或将最后一行替换为done | ksh

    如果文件不是全部​​.txt 文件,这更笼统一些:

    for f in *
    do
      ext="${f##*.}"
      g="${f%%_*}.${ext}"
      echo mv "${f}" "${g}"
    done
    

    【讨论】:

    • 感谢您的回复。如何将您的代码扩展到必须删除扩展名 .txt 之前的最后 12 个字符的情况,例如 .
    • 如果它正好是 12,${f%????????????} (12 ?s) 将在你已经剥离扩展后工作,如果你的 ksh 足够新......或者@987654330 @。不过,这些都是 ksh 某些版本中的新功能,因此请检查您系统上的 man ksh 以获取更多信息...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2013-11-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多