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、マイベックス

4

1 に答える 1

1

私のアドバイスは、実行したいコマンドをエコーし​​て、それが正しいと確信したときに行うことです| sh

利点は、cp/mkdir などを実行せずに行われる変更を目で確認できることです。

Perl複雑な正規表現を使用してファイルの名前を変更するときに、この手法を使用します。

EDIT Fuller の例は、便宜上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
于 2013-02-15T11:39:17.213 に答える