Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于多个文件的Bash循环_Bash_Unix - Fatal编程技术网

用于多个文件的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