我正在努力创造一个"手表"文件夹,我将能够复制文件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。这样做的正确方法是什么?
答案 0 :(得分:1)
strsub($filename, -4)
Bash中的是
${filename:(-4)}
您的命令可能看起来像
/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
唯一的另一个修改是将完整命令全部放在最后一行。我把它分开来确保它很容易看到。