0

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

  test_XXXXX.txt  
  best_YYY.txt   
  nest_ZZZZZZZZZ.txt

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

  test.txt   
  best.txt   
  nest.txt

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

谢谢,

4

2 回答 2

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
于 2013-07-11T19:51:56.943 回答
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

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

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

于 2013-07-11T19:06:48.910 回答