通过更改其前缀来重命名一组文件

时间:2011-12-22 21:35:47

标签: bash file-rename renaming

我有一套四个目录

 English.lproj
 German.lproj
 French.lproj
 Italian.lprj

每个都包含一系列名为

的XML
 2_symbol.xml
 4_symbol.xml
 5_symbol.xml
 ... and so on ...

我需要将所有这些文件重命名为另一种数字模式, 因为确定这些数字的代码已经改变。 所以新的数字模式就像

 1_symbol.xml
 5_symnol.xml
 3_symbol.xml
 ... and so on ...
因此,没有适用于确定此系列的算法 我之所以考虑将两个数字序列存储到一个数组中。

我正在考虑使用简单的bash脚本快速完成它。 我认为我需要一个数组来存储旧的数字模式和另一个 数组存储新的数字模式,这样我就可以执行一个循环来制作

 # move n_symbol.xml newdir/newval_symbol.xml

任何建议?

欢呼声。

-k -

2 个答案:

答案 0 :(得分:2)

你不需要bash,任何与POSIX兼容的shell都可以。

repls="1:4 2:1 4:12 5:3"

for pair in $repls; do
  old=${pair%:*}
  new=${pair#*:}
  file=${old}_symbol.xml
  mv $file $new${file#$old}
done

编辑:您需要处理覆盖文件。例如,clobbers 4_symbol.xml上面的代码片段。

for pair in $repls; do
  ...
  mv $file $new${file#$old}.tmp
done
for f in *.tmp; do
  mv $f ${f%.tmp}
done

答案 1 :(得分:1)

以下脚本将随机对“lproj”目录中所有xml文件的符号名称进行随机播放。

#!/bin/bash

shuffle() { # Taken from http://mywiki.wooledge.org/BashFAQ/026
    local i tmp size max rand

    size=${#array[*]}
    max=$(( 32768 / size * size ))

    for ((i=size-1; i>0; i--)); do
        while (( (rand=$RANDOM) >= max )); do :; done
        rand=$(( rand % (i+1) ))
        tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
    done
}

for file in *lproj/*.xml; do # get an array of symbol names
    tmp=${file##*/}
    array[$((i++))]=${tmp%%_*}
done

shuffle # shuffle the symbol name array

i=0
for file in *lproj/*.xml; do # rename the files with random symbols
    echo mv "$file" "${file%%/*}/${array[$((i++))]}_${file##*_}"
done

注意 :当您对结果感到满意时,移除echo前面的mv并重新运行脚本这些变化是永久性的。

脚本输出

$ ./randomize.sh
mv 1.lproj/1_symbol.xml 1.lproj/16_symbol.xml
mv 1.lproj/2_symbol.xml 1.lproj/12_symbol.xml
mv 1.lproj/3_symbol.xml 1.lproj/6_symbol.xml
mv 1.lproj/4_symbol.xml 1.lproj/4_symbol.xml
mv 2.lproj/5_symbol.xml 2.lproj/14_symbol.xml
mv 2.lproj/6_symbol.xml 2.lproj/1_symbol.xml
mv 2.lproj/7_symbol.xml 2.lproj/3_symbol.xml
mv 2.lproj/8_symbol.xml 2.lproj/7_symbol.xml
mv 3.lproj/10_symbol.xml 3.lproj/10_symbol.xml
mv 3.lproj/11_symbol.xml 3.lproj/11_symbol.xml
mv 3.lproj/12_symbol.xml 3.lproj/2_symbol.xml
mv 3.lproj/9_symbol.xml 3.lproj/8_symbol.xml
mv 4.lproj/13_symbol.xml 4.lproj/13_symbol.xml
mv 4.lproj/14_symbol.xml 4.lproj/15_symbol.xml
mv 4.lproj/15_symbol.xml 4.lproj/9_symbol.xml
mv 4.lproj/16_symbol.xml 4.lproj/5_symbol.xml