2013-02-15 1 views
1

나는 아래와 같은 파일 구조를 가지고 국가 코드를 기반으로 이 국가 코드로 시작하여 파일 이름을 바꿉니다. 그러나 국가 코드가없는 파일이 있습니다.이 파일은 루트 폴더 ($ 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을 사용하여이 기술을 사용합니다. 풀러 예는

EDIT은 편의상 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