如何使用Bash更改多个文件名大小写以匹配另一个目录?

时间:2012-08-31 07:01:52

标签: bash case minecraft

我正在从一个基于YAML的系统迁移到另一个系统,将数据从一种管理样式合并到下一种管理样式。

path/to/directory/one/中,文件名为foobar1.ymlfoobar2.yml,... 在path/to/new/directory/two/中,文件名为FooBar1.ymlFooBar3.yml,...

在原始系统中,path/to/directory/other/中有文件名FooBar1.datFooBar2.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

这里的第一个问题,如果我太具体或模糊,请告诉我。

2 个答案:

答案 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