0

我有一堆目录,例如

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 到 am,我知道我可以一个一个地做到这一点,mv 2013_03_12_18_26_am am但这需要很长时间。这可以从 shell 脚本中实现吗?

我希望最后一个“_”之后的所有内容都是新目录的名称。

4

5 回答 5

3

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

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

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

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

于 2013-03-21T16:57:31.333 回答
2

如果所有目录都遵循上述形式,那么在 bash 中,您可以使用以下变量替换来提取最终后的字符_

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

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

于 2013-03-21T16:56:12.527 回答
1
 for d in *_??
 do
     newd=$(expr $d : '.*_\([a-z][a-z]*\)')
     mv $d $newd
 done
于 2013-03-21T16:56:22.153 回答
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

外壳脚本:

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 更具体。

于 2013-03-21T16:58:45.283 回答
0

我喜欢这个重命名命令,它允许像这样的 perl regexp:

rename 's/.*([a-z]{2})$/$1/' *
于 2013-03-21T17:21:48.013 回答