BASH:如何在文件名中间重命名大量文件insertnig文件夹名称

时间:2013-09-30 18:49:22

标签: regex bash sed mv

(我在Bash环境中,在Windows机器上使用Cygwin,使用awk,sed,grep,perl等...) 我想将最后一个文件夹名称添加到文件名中,就在最后一个下划线(_)之后是数字之前,或者如果文件名中没有数字则在末尾添加。

以下是我所拥有的一个例子(需要重新组织数百个文件):

./aaa/A/C_17x17.p
./aaa/A/C_32x32.p
./aaa/A/C.p
./aaa/B/C_12x12.p
./aaa/B/C_4x4.p
./aaa/B/C_A_3x3.p
./aaa/B/C_X_91x91.p
./aaa/G/C_6x6.p
./aaa/G/C_7x7.p
./aaa/G/C_A_113x113.p
./aaa/G/C_A_8x8.p
./aaa/G/C_B.p
./aab/...

我想重命名所有这些文件:

./aaa/C_A_17x17.p
./aaa/C_A_32x32.p
./aaa/C_A.p
./aaa/C_B_12x12.p
./aaa/C_B_4x4.p
./aaa/C_A_B_3x3.p
./aaa/C_X_B_91x91.p
./aaa/C_G_6x6.p
./aaa/C_G_7x7.p
./aaa/C_A_G_113x113.p
./aaa/C_A_G_8x8.p
./aaa/C_B_G.p
./aab/...

我用sed尝试了很多bash for循环,最后一个是以下内容:

IFS=$'\n'
for ofic in `find * -type d -name 'A'`; do
  fic=`echo $ofic|sed -e 's/\/A$//'`
  for ftr in `ls -b $ofic | grep -E '.png$'`; do
    nfi=`echo $ftr|sed -e 's/(_\d+[x]\d+)?/_A\1/'`
    echo mv \"$ofic/$ftr\" \"$fic/$nfi\"
  done
done

但是没有成功...... \1没有插入此$nfi ... 这是我尝试的最后一个,只处理1个文件夹(这是一个巨大的文件夹集合的子文件夹),经过60多分钟的不成功试用,我和你们在一起。

2 个答案:

答案 0 :(得分:1)

# it's easier to change to here first
cd aaa
# process every file
for f in $(find . -type f); do
  # strips everything after the first / so this is our foldername
  foldername=${f/\/*/}
  # creates the new filename from substrings of the
  # original filename concatenated to the foldername 
  newfilename=".${f:1:3}${foldername}_${f:4}"
  # if you are satisfied with the output, just leave out the `echo`
  # from below
  echo mv ${f} ${newfilename}
done

可能会为你工作。

See here in action.(略有修改,因为ideone.com处理STDIN/find不同......)

答案 1 :(得分:1)

我修改了您的脚本,使其适用于您的所有示例。

IFS=$'\n'
for ofic in ???/?; do
  IFS=/ read fic fia <<<$ofic
  for ftr in `ls -b $ofic | grep -E '\.p.*$'`; do
    nfi=`echo $ftr|sed -e "s/_[0-9]*x[0-9]*/_$fia&/;t;s/\./_$fia./"`
    echo mv \"$ofic/$ftr\" \"$fic/$nfi\"
  done
done