переименуйте набор файлов, изменив их префикс - PullRequest
0 голосов
/ 23 декабря 2011

У меня есть набор из четырех каталогов

 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

есть предложения?

Thx N Cheers.

-K-

Ответы [ 2 ]

2 голосов
/ 23 декабря 2011

для этого вам не нужен bash, подойдет любая POSIX-совместимая оболочка.

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

edit: вам нужно позаботиться о перезаписи файлов.фрагмент выше 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 голос
/ 23 декабря 2011

Следующий скрипт случайным образом перемешивает имена символов всех файлов xml в каталогах 'lproj'.

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...