在扩展名之前从Unix文件名中删除最后n个字符

时间:2013-07-11 19:02:45

标签: file-rename

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

  test_XXXXX.txt  
  best_YYY.txt   
  nest_ZZZZZZZZZ.txt

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

  test.txt   
  best.txt   
  nest.txt

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

谢谢,

2 个答案:

答案 0 :(得分:0)

如果这是一次(或不经常)的场合,我会用

创建一个脚本
$ 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和ZZZZZZZZZZZ是什么。


附录

根据自己的喜好修改:

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

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

注意:如果存在不匹配的文件名,则执行文件名而不是mv命令。我省略了一种只选择匹配文件名的方法。

答案 1 :(得分:0)

在这种情况下,您似乎有一个_来启动您要删除的每个部分。如果是这样,那么这应该有效:

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