一次重命名多个目录

时间:2013-03-21 16:50:04

标签: bash shell dir

我有很多目录,例如

2013_03_12_18_26_am
2013_03_12_18_26_cu
2013_03_12_18_26_ig
2013_03_12_18_26_mdf
2013_03_12_18_26_pih
2013_03_12_18_26_tn
2013_03_12_18_26_an
2013_03_12_18_26_cv
2013_03_12_18_26_ik
2013_03_12_18_26_mhr
2013_03_12_18_26_pnb    
2013_03_12_18_26_to

我想要做的是将它们重命名为最后两个字符,例如: 2013_03_12_18_26_am到了, 我知道我可以逐一mv 2013_03_12_18_26_am am这样做,但这需要很长时间。这可以从shell脚本中完成吗?

我想要在最后一次之后的所有事情" _"成为新目录的名称。

5 个答案:

答案 0 :(得分:3)

我注意到那些目录名称没有空格或其他特殊字符。所以你可以尝试:

ls|xargs -n1 |sed -r 's/(.*_)(.*)/mv & \2/'

为您打印mv cmd。如果您认为所有命令都正确,那么您只需将其传递给|sh

请注意,ls部分您可以更改为仅获取这些目录。

答案 1 :(得分:2)

如果以上表格后面的所有目录都在bash中你可以使用以下变量subsitituion来提取最终_之后的字符

var=2013_03_12_18_26_am
echo ${var##*_} #am

然后,您可以使用以下命令重命名文件夹中的所有目录:

for dir in *_*; do #as there may be more than 2 chars after final _
    new_dir=${dir##*_}
    mv $dir $new_dir
done

当然,您需要添加检查以确保只移动目录并且不会覆盖任何内容。

答案 2 :(得分:1)

 for d in *_??
 do
     newd=$(expr $d : '.*_\([a-z][a-z]*\)')
     mv $d $newd
 done

答案 3 :(得分:1)

这假设您的所有(并且只有所有)文件夹都在一个目录中。所以要小心......

原件:

marks-mac-pro:test mstanislav$ ls
2013_03_12_18_26_am 2013_03_12_18_26_an 2013_03_12_18_26_cu 2013_03_12_18_26_cv     2013_03_12_18_26_ig 2013_03_12_18_26_ik 2013_03_12_18_26_mdf    2013_03_12_18_26_mhr    2013_03_12_18_26_pih    2013_03_12_18_26_pnb    2013_03_12_18_26_tn 2013_03_12_18_26_to

Shell脚本:

marks-mac-pro:test mstanislav$ for i in `ls .`; do NEW=`echo $i | cut -d_ -f6`; mv $i $NEW; done

结果:

marks-mac-pro:test mstanislav$ ls
am  an  cu  cv  ig  ik  mdf mhr pih pnb tn  to

在对真实数据进行测试之前,请先测试一下,以确保。再次,只在一个目录中执行此操作,只需要重命名文件夹,或者重写 ls 的第一部分 更具体。

答案 4 :(得分:0)

我喜欢这个的rename命令,它允许perl regexp如下:

rename 's/.*([a-z]{2})$/$1/' *