用于多个文件的Bash循环
我有数千个两组文件,一个文件名为用于多个文件的Bash循环,bash,unix,Bash,Unix,我有数千个两组文件,一个文件名为name.ext,另一个文件名为name.new.psl。因此,对于每个name.ext都有一个name.new.psl。现在我必须将其作为参数传递给脚本,例如customize.pl name.ext name.new.psl 有没有在bash中循环的想法?名字对于每个name.ext和name.new.psl都是通用的,比如: perl customise.pl name.ext name.new.psl 将在当前工作目录中为您执行此操作 for fname
name.ext
,另一个文件名为name.new.psl
。因此,对于每个name.ext
都有一个name.new.psl
。现在我必须将其作为参数传递给脚本,例如customize.pl name.ext name.new.psl
有没有在bash中循环的想法?名字对于每个name.ext
和name.new.psl
都是通用的,比如:
perl customise.pl name.ext name.new.psl
将在当前工作目录中为您执行此操作
for fname in *.ext
do
perl customise.pl "$fname" "${fname%.ext}.new.psl"
done
以上内容不需要任何特殊的bash特性。因此,它与debian派生发行版上的默认shell(/bin/sh
)兼容,例如,dash
上面的技巧是,${fname%.ext}
告诉shell从$fname
的末尾删除文本.ext
,只留下“name”部分。因此,“${fname%.ext}.new.psl”
删除了.ext
添加了.new.psl
扩展名
上面代码中的文件名用双引号引起来。这就是为什么即使文件名中有空格,这个脚本也能工作。嗨,文件名是这样的,我遇到了错误,建议用bashgi_322422812_ref_NC_015111.1_u.fsa.shIDs.ext gi_322422812_NC_015111.1_u.fsa.shIDs.new.pslUsing
$(ls*.ext)
代替*。ext
肯定是非常差劲的。全局标记法*.ext
在文件名中使用空格和其他特殊字符进行管理;$(ls*.ext)
符号在包含空格等的文件名上断开。千万不要在$(cmd)上对i使用。我同意你的看法。Zsolt Botykai的答案更为恰当,这要感谢Idriss NeumannIs在${f/%.txt/.new.psl}
中将${f%.txt}
符号与${f/.txt/.new}
中的%
合并在一起。使用%
将模式锚定到字符串的末尾,与正则表达式类似,$
@JonathanLeffle chepner是正确的。在我看来,这样匹配扩展更可靠。不要再发问了
for f in *.ext ; do
perl customise.pl "${f}" "${f/%.txt/.new.psl}"
done
for fname in *.ext
do
perl customise.pl "$fname" "${fname%.ext}.new.psl"
done