Bash foreach on cronjob

时间:2014-07-12 23:09:08

标签: bash loops unix foreach cron

我正在努力创造一个"手表"文件夹,我将能够复制文件2组具有相同名称但不同文件扩展名的文件。我有一个程序,需要引用这两个文件,但由于它们具有相同的名称,只有不同的扩展我想我可以用cron作业做这样的事情

cronjob.sh:

#/bin/bash
ls *.txt > processlist.txt

for filename in 'cat processlist.txt'; do

/usr/local/bin/runcommand -input1=/home/user/process/$filename \
-input2=/home/user/process/strsub($filename, -4)_2.stl \
-output /home/user/process/done/strsub($filename, -4)_2.final;

echo "$filename finished processing"
done

但substr是一个php命令,而不是bash。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

strsub($filename, -4)
Bash中的

${filename:(-4)}

请参阅Shell Parameter Expansion

您的命令可能看起来像

/usr/local/bin/runcommand "-input1=/home/user/process/$filename" \
    "-input2=/home/user/process/${filename:(-4)}_2.stl" \
    "-output /home/user/process/done/${filename:(-4)}_2.final"

注意:首选引用带有双引号变量的参数,以防止分词和可能的路径名扩展。这对包含空格的文件名很有帮助。

最好将你的glob模式作为参数直接传递给for,以正确分配标记,而不会通过单词拆分进行拆分。

for filename in *.txt; do

答案 1 :(得分:0)

所以Konsolebox的解决方案几乎是正确的,但问题是,当你执行$ {filename:( - 4)}时,它只返回变量的最后4个字母,而不是修剪最后4个字母。当我这样做时,将其更改为${filename%.txt},其中%.txt与我要查找和删除的文本匹配,然后在末尾标记.mp3以更改扩展名。

他对使用这个for循环的其他建议也比我好得多:

for filename in *.txt; do

唯一的另一个修改是将完整命令全部放在最后一行。我把它分开来确保它很容易看到。