我有一个类似下面的文件结构:
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
答案 0 :(得分:1)
我的建议只是回应你想要做的命令,然后当你确定它是正确的| sh
。
好处是你可以在没有完成cp / mkdir等的情况下进行改变。
当我想使用复杂的regexp重命名文件时,我使用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