2013-02-15 42 views
1

我有类似下面的文件结构:重组和重命名基于国家代码

Localizable 
Localizable_en 
Localizable_de 
Localizable_es 
Localizable_zh_CN 
Root 
Root_de 
Root_en 
Root_es 
Root_zh_CN 
TechnicalSupportPane 
TechnicalSupportPane_jp 
TechnicalSupportPane_de 
TechnicalSupportPane_es 
TechnicalSupportPane_en 
TechnicalSupportPane_zh_CN 

我想所有文件_ [国家代码]复制到文件夹(MKDIR)从这个国家代码开始并重命名该文件。但是没有国家代码的文件应该被复制到根文件夹($ TRANSLATION_FOLDER)中。如果找到像zh_CN这样的中国国家代码,则应将其转换为zh-Hans。

到目前为止,我有以下编码,但没有国家代码的文件被忽略 - 或错误地复制。

mkdir $SETTINGS_FOLDER 
mkdir $TRANSLATION_FOLDER 

for XLF in $(find "." -maxdepth 1 -iname "*.xlf"); 
do 

    TMP_LANGUAGE=${XLF: -6} 
    LANGUAGE=${TMP_LANGUAGE:0:2} 

    if [[ "$XLF" == *zh* ]] 
    then 
     LANGUAGE_PROJ_FOLDER="zh-Hans.project" 
    else 
     LANGUAGE_PROJ_FOLDER=$LANGUAGE".project" 
    fi 

    TMP_FILE_NAME=${XLF%.xlf} 
    FILE_NAME=${TMP_FILE_NAME##*/} 

    echo "Processing language "$LANGUAGE" with file "$FILE_NAME 

    if [[ "$XLF" == *Localizable* ]] 
    then 
     echo "Processing Localizable" $XLF 

     mkdir $TRANSLATION_FOLDER"/"$LANGUAGE_PROJ_FOLDER 

     cp $FILE_NAME_STRING $TRANSLATION_FOLDER"/"$LANGUAGE_PROJ_FOLDER"/Localizable" 
    else 
     echo "Processing Root and TechnicalSupportPane" $XLF 

     mkdir $SETTINGS_BUNDLE_FOLDER"/"$LANGUAGE_PROJ_FOLDER 
     cp $FILE_NAME_STRING $SETTINGS_FOLDER"/"$LANGUAGE_PROJ_FOLDER 
    fi 
done 

我删除文件前缀和检查在最后的国家代码 - 这适用于带有国家代码的所有文件,但是从那些没有最后采取字符 - 这是错误的。

有创建和复制这些文件解析这些文件结构的有效方法吗?

BR, mybecks

回答

1

我的建议是只为了呼应你想要做的,然后当你确定它是正确的| sh的命令。

好处是,你可以眼球的变化,将没有cp/mkdir等被做。

当我想使用复杂正则表达式重命名文件时,我使用这种技术使用Perl

编辑更充分的例子是从DATA部分读取以方便起见。

use strict; 
my $dest = "some-destination"; 
while(<DATA>) { 
    chomp; 
    my $filename = $_; 
    my($file, $cc) = m!(.+?)_(.*)!; 
    $file = $_ unless $file; 
    # Fix chinese zh_CN -> zh-Hans 
    $cc =~ s!(.+)_CN!$1-Hans!; 

    #print "# file=$file cc=$cc\n"; 

    if ($cc) { 
     print "mkdir -p $dest/$cc\n"; 
     print "cp $filename $dest/$cc/$file\n"; 
    } 
    else { 
     print "cp $filename $dest\n"; 
    } 
    print "\n"; 
} 
__DATA__ 
Localizable 
Localizable_en 
Localizable_de 
Localizable_es 
Localizable_zh_CN 
Root 
Root_de 
Root_en 
Root_es 
Root_zh_CN 
TechnicalSupportPane 
TechnicalSupportPane_jp 
TechnicalSupportPane_de 
TechnicalSupportPane_es 
TechnicalSupportPane_en 
TechnicalSupportPane_zh_CN 

输出可能通过sh如果正确,当然通过管道输送。

cp Localizable some-destination 

mkdir -p some-destination/en 
cp Localizable_en some-destination/en/Localizable 

mkdir -p some-destination/de 
cp Localizable_de some-destination/de/Localizable 

mkdir -p some-destination/es 
cp Localizable_es some-destination/es/Localizable 

mkdir -p some-destination/zh-Hans 
cp Localizable_zh_CN some-destination/zh-Hans/Localizable 

cp Root some-destination 

mkdir -p some-destination/de 
cp Root_de some-destination/de/Root 

mkdir -p some-destination/en 
cp Root_en some-destination/en/Root 

mkdir -p some-destination/es 
cp Root_es some-destination/es/Root 

mkdir -p some-destination/zh-Hans 
cp Root_zh_CN some-destination/zh-Hans/Root 

cp TechnicalSupportPane some-destination 

mkdir -p some-destination/jp 
cp TechnicalSupportPane_jp some-destination/jp/TechnicalSupportPane 

mkdir -p some-destination/de 
cp TechnicalSupportPane_de some-destination/de/TechnicalSupportPane 

mkdir -p some-destination/es 
cp TechnicalSupportPane_es some-destination/es/TechnicalSupportPane 

mkdir -p some-destination/en 
cp TechnicalSupportPane_en some-destination/en/TechnicalSupportPane 

mkdir -p some-destination/zh-Hans 
cp TechnicalSupportPane_zh_CN some-destination/zh-Hans/TechnicalSupportPane 

Noddy从命令行的示例,而你的将是一个脚本。

bash-3.2$ echo "cat t1" 
cat t1 

bash-3.2$ echo "cat t1" |sh 
0.2 1.45 
0.3 1.67 
0.1 1.23 
1e-2 1.23 
0.2 1.45 
1e-1 1.23 
0.3 1.67 
0.3 1.67 
0.4 1.78 
0.5 1.89