【发布时间】: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
我在 Unix 目录中有一堆文件:
test_XXXXX.txt
best_YYY.txt
nest_ZZZZZZZZZ.txt
我需要将这些文件重命名为
test.txt
best.txt
nest.txt
我在 AIX 上使用 Ksh。请告诉我如何使用单个命令完成上述操作。
谢谢,
【问题讨论】:
标签: file-rename
如果这是一次(或不经常)的场合,我会创建一个脚本
$ 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 命令。我省略了只选择匹配文件名的方法。
【讨论】:
在这种情况下,您似乎有一个_ 来开始您要删除的每个部分。如果是这样的话,那么这应该可以工作:
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
【讨论】:
${f%????????????} (12 ?s) 将在你已经剥离扩展后工作,如果你的 ksh 足够新......或者@987654330 @。不过,这些都是 ksh 某些版本中的新功能,因此请检查您系统上的 man ksh 以获取更多信息...