0

我有一个命令 gennlm.sh,它需要两个参数——输入文件和输出文件夹。我想获取目录中的每个文件,将它们用于输入,然后转换每个输入文件名以提供输出文件夹,并将其全部设置为 cronjob。这就是我到目前为止所拥有的:

10 */6 * * * for file in /var/www/parsingdev/corpus/*; do bash /var/www/parsingdev/meTypeset/tools/gennlm.sh $file '$file | sed -e "s/.*\//\/var\/www\/parsingdev\/output\//g" -e "s/\.docx//g"'; done

但是,我试图使第二个参数工作的方式似乎有问题,所有子字符串函数都嵌套在“”中,因为预期的字符串参数没有按预期传递给 gennlm.sh脚本。介意澄清我需要做什么才能完成这项工作吗?谢谢!

4

2 回答 2

0

您不能在单引号中使用变量。

相反,做

10 */6 * * * for file in /var/www/parsingdev/corpus/*; do fileX=${file%.docx}; bash /var/www/parsingdev/meTypeset/tools/gennlm.sh ${fileX##*/}; done

我希望我了解您原始命令中的废话:

'$file | sed -e "s/.*\//\/var\/www\/parsingdev\/output\//g" -e "s/\.docx//g"

笔记

“双引号”每个扩展,以及任何可能包含特殊字符的内容,例如。“$var”、“$@”、“${array[@]}”、“$(command)”。使用“单引号”来表达文字,例如。“成本 5 美元”。请参阅http://mywiki.wooledge.org/Quotes、http://mywiki.wooledge.org/Argumentshttp://wiki.bash-hackers.org/syntax/words_

于 2013-10-28T20:18:34.877 回答
0

如果我理解正确,您的 sed 应该采用文件的基本名称并删除其.docx扩展名(如果有),并为其添加路径。那么,既然您已经启动了 bash,为什么不在 bash 中做所有事情呢?

for file in /var/www/parsingdev/corpus/*; do bash -c 'out=${1##*/}; /var/www/parsingdev/meTypeset/tools/gennlm.sh "$1" "/var/www/parsingdev/output/${out%.docx}"' _ "$file"; done

或者实际上是 bash 中的所有内容:

bash -c 'for file in /var/www/parsingdev/corpus/*; do out=${file##*/}; /var/www/parsingdev/meTypeset/tools/gennlm.sh "$file" "/var/www/parsingdev/output/${out%.docx}"; done'
于 2013-10-28T20:26:30.643 回答