在unix中使用循环重命名文件

时间:2014-10-04 18:33:19

标签: linux shell unix awk

我有一个情况。 我在Linux中有很多像下面这样的文件

SIPTV_FIPTV_ID00$line_T20141003195717_C0000001000_FWD148_IPV_001.DATaac
SIPTV_FIPTV_ID00$line_T20141003195717_C0000001000_FWD148_IPV_001.DATaag

我想删除$ line并为我的6000个这样的文件制作一个从0001到6000的计数器。 此外,我想在每个文件完成后删除3个字符的预告片。

修复文件后应该像

SIPTV_FIPTV_ID0000001_T20141003195717_C0000001000_FWD148_IPV_001.DAT
SIPTV_FIPTV_ID0000002_T20141003195717_C0000001000_FWD148_IPV_001.DAT

请帮忙。

2 个答案:

答案 0 :(得分:0)

有了一些假设,我认为应该这样做: 1.文件列表位于名为input.txt的文件中,每行一个文件 2.代码在文件所在的目录中运行 3. bash可用

awk '{i++;printf "mv \x27"$0"\x27 ";printf "\x27"substr($0,1,16);printf "%05d", i;print substr($0,22,47)"\x27"}' input.txt | bash

答案 1 :(得分:0)

从命令提示符

给出以下命令

% echo *.DAT??? | awk '{
    old=$0;
    sub("\\$line",sprintf("%4.4d",++n));
    sub("...$","");
    print "mv", old, $1}'
%

并检查输出,如果看起来没问题

% echo *.DAT??? | awk '{
    old=$0;
    sub("\\$line",sprintf("%4.4d",++n));
    sub("...$","");
    print "mv", old, $1}' | sh
%

评论:echo *.DAT???旨在为awk提供您要修改的所有文件名列表的输入,如果您提供的示例名称不代表整个频谱...关于awk脚本本身,我使用sprintf生成一个字符串,其中包含正确数量的零,用于替换$line,成语`" \\ $。 .."有两个反斜杠引用gawk需要美元符号并且没有伤害mawk,作为最后一句话我不得不说在类似情况下我更喜欢在将命令传递给shell之前至少进行一次干运行。

相关问题