我正在从一个基于YAML的系统迁移到另一个系统,将数据从一种管理样式合并到下一种管理样式。
在path/to/directory/one/
中,文件名为foobar1.yml
,foobar2.yml
,...
在path/to/new/directory/two/
中,文件名为FooBar1.yml
,FooBar3.yml
,...
在原始系统中,path/to/directory/other/
中有文件名FooBar1.dat
,FooBar2.dat
。它们与path/to/directory/one/
中的文件1:1匹配,但它们具有正确的大小写和不同的扩展名和文件内容。
我想使用bash来读取path/to/directory/one/
中的每个文件,抓取我需要导入的行,更改其中一行,然后将它们写入path/to/new/directory/two/
中正确的相应文件匹配正确的大小写,如果该文件不存在则创建一个新文件。
具体来说,我正在尝试将Minecraft插件的数据从Essentials迁移到AdminCmd和WorldPos。
以下是各种文件和格式的示例:http://pastebin.com/PMtCMXGt
这里的第一个问题,如果我太具体或模糊,请告诉我。
答案 0 :(得分:0)
类似的东西:
cd path/to/directory/one/
for f in *.yml
do
grep 'whatyouwant' $f >> path/to/new/directory/two/$(sed 's/foobar/FooBar/' <<<$f)
done
我们使用bash
“here string”来构建新文件名
答案 1 :(得分:0)
我写了一些我认为可以使用的基础。让我知道它是否派上用场或缺乏
DIRONE=/path/to/dir/one
DIROTHER=/path/to/dir/other
for f in $DIRONE/*.yml
do
basename $f
done | sed -e 's/(.+)\.yml/\1/' | while read name;
do
# find a matching .dat file in $DIRTWO
for f2 in $DIROTHER/*.dat
do
basename $f2
done | sed -r 's/(.+)\.dat/\1 \L\1/' | while read nameOrig nameLower;
do
if [ $nameLower -eq $name ]; then
#nameLower is foobar1.yml in /path/to/dir/one
#nameHigher is FooBar1.dat in /path/to/dir/two
echo "$nameOrig matches $name"
break;
fi
done
done