2013-02-15 53 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