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

我想将带有 _[Country Code] 的所有文件复制到以该国家/地区代码开头的文件夹 (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 回答