如何在unix中重命名多个文件

时间:2014-09-24 15:45:54

标签: shell unix

我想使用shell脚本重命名一个目录中的多个文件 这些文件有共同的前缀:

Modify: 2014-09-19 16:08:35.000000000 +0300-16:08:35.000000000-OCS_dmobfw1-oam_d04_20140919_155335.csv
Modify: 2014-09-19 16:09:23.000000000 +0300-16:09:23.000000000-OCS_dmobfw1-oam_d01_20140919_155423.csv
Modify: 2014-09-19 16:09:51.000000000 +0300-16:09:51.000000000-OCS_dmobfw1-oam_d09_20140919_155451.csv
Modify: 2014-09-19 16:12:40.000000000 +0300-16:12:40.000000000-OCS_dmobfw1-oam_d07_20140919_155740.csv
Modify: 2014-09-19 16:14:48.000000000 +0300-16:14:48.000000000-OCS_dmobfw1-oam_d05_20140919_155948.csv
Modify: 2014-09-19 16:18:14.000000000 +0300-16:18:14.000000000-OCS_dmobfw1-oam_d03_20140919_160314.csv
Modify: 2014-09-19 16:18:15.000000000 +0300-16:18:15.000000000-OCS_dmobfw1-oam_d08_20140919_160315.csv

我想从所有文件中删除以下部分:

  

修改时间:2014-09-19 16:08:35.000000000 + 0300-16:08:35.000000000 -

所以输出可以是这样的:

  

OCS_dmobfw1-oam_d01_20140423_223805.csv   OCS_dmobfw1-oam_d01_20140423_223905.csv

我试过了:

 for name in Modify* ;
do
 mv "$name"  $(echo $name | sed 's/Modify: 2014-09-19 16:18:14.000000000 +0300-16:18:14.000000000-/ /g') ;
done

3 个答案:

答案 0 :(得分:0)

for name in Modify* ;
do
    new=`echo $name | sed 's/Modify: 2014-09-19 16:18:14.000000000 +0300-16:18:14.000000000-//g'`; 
    mv $name $new;
done

答案 1 :(得分:0)

例如:

for name in Modify*
do
    echo mv "$name" "$(sed -E 's/Modify: .{55}//'<<<"$name")"
done

如果满意则删除回声..

<<<是bash扩展名,如果你没有bash使用

    echo mv "$name" "$(echo "$name" | sed -E 's/Modify: .{55}//')"

如果每个文件都包含OCS,则可以使用较短的文件:

    echo mv "$name" "$(grep -o 'OCS.*' <<<"$name")"

答案 2 :(得分:0)

您接受的答案可能更简单,至少同样好,但您可以使用find进行操作。

find . -mindepth 1 -maxdepth 1 -name 'Modify*' -execdir sh -c 'mv -n "$@" "$(echo "$@" | sed "s,Modify: .\{55\},,")";' -- '{}' \;

如果您想 recurse 进入子目录,这种方法将非常有用。在这种情况下,请删除-maxdepth 1选项。

原始尝试的关键问题是您的文件名都有不同的时间戳,但您只是替换了特定的时间戳。