0

我有两个文件夹,里面装满了培训和相应的测试文件,我想使用 shell 脚本相互运行拟合对。

这是我到目前为止所拥有的:

for x in SpanishLS.train/*.train
do
    timbl -f $x -t SpanishLS.test/$x.test
done

这应该接受file1(-n).train一个目录,在另一个目录中查找file1(-n).test,然后通过一个名为timbl. 它所做的是寻找一个名为SpanishLS.train/file1(-n).train.test当然不存在的文件。我试图做的,但无济于事,是以$x一种让脚本找到正确文件的方式截断,但每当我这样做时,$x都被截断得太早,导致脚本甚至找不到.train文件。

我应该如何编码?

4

3 回答 3

4

如果我说对了,这将完成工作:

for x in SpanishLS.train/*.train
do
    y=${x##*/}  # strip basepath
    y=${y%.*} # strip extention
    timbl -f $x -t SpanishLS.test/$y.test
done
于 2012-08-12T17:38:01.133 回答
2

使用basename

for x in SpanishLS.train/*.train
do
    timbl -f $x -t SpanishLS.test/$(basename "$x" .train).test
done

这会从 中删除目录前缀和.train后缀$x,并建立您想要的名称。

bash(和其他符合 POSIX 的 shell)中,您可以basename使用两个 shell参数扩展来执行操作,而无需调用外部程序。(我认为没有办法将这两个扩展合并为一个。)

for x in SpanishLS.train/*.train
do
    y=${x##*/}                                        # Remove path prefix
    timbl -f $x -t SpanishLS.test/${y%.train}.test    # Remove .train suffix
done

注意:bash支持相当多(有用的)POSIX 未定义的扩展。例如,${y//.train/.test}bash-only 表示法(或bash兼容的 shell 表示法)。

于 2012-08-12T17:33:51.140 回答
0

.train将文件名中所有出现的 替换为.text

timbl -f $x -t $(echo $x | sed 's/\.train/.text/g')
于 2012-08-12T17:34:58.940 回答