我有两个充满训练和相应测试文件的文件夹,我想使用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
文件。
我该如何编码?
答案 0 :(得分: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
答案 1 :(得分:2)
使用basename
:
for x in SpanishLS.train/*.train
do
timbl -f $x -t SpanishLS.test/$(basename "$x" .train).test
done
从.train
中删除目录前缀和$x
后缀,并建立您想要的名称。
在bash
(以及其他POSIX-compliant shells)中,您可以使用两个shell parameter expansions执行basename
操作,而无需调用外部程序。 (我认为没有办法将两个扩展合并为一个。)
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
- 仅表示法(或bash
和兼容的贝壳表示法)。
答案 2 :(得分:0)
将文件名中出现的所有.train
替换为.text
:
timbl -f $x -t $(echo $x | sed 's/\.train/.text/g')