【问题标题】:renaming files using loop in unix在Unix中使用循环重命名文件
【发布时间】:2014-10-04 18:33:19
【问题描述】:

我这里有个情况。 我在 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

请帮忙。

【问题讨论】:

  • 你对 Perl 满意吗?

标签: linux shell unix awk


【解决方案1】:

有了一些假设,我认为应该这样做: 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

【讨论】:

    【解决方案2】:

    在命令提示符下输入以下命令

    % 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 之前至少进行一次空运行......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2019-07-05
      • 2014-10-05
      • 2012-02-12
      相关资源
      最近更新 更多