Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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 - Fatal编程技术网

Bash 对所有文件执行命令,并使用脚本参数中的文件名存储在新目录中

Bash 对所有文件执行命令,并使用脚本参数中的文件名存储在新目录中,bash,Bash,我想对我目录中扩展名为.fa的所有文件运行脚本。脚本有一个输出目录的参数,我想使用这个参数的文件名 要在一个文件上运行脚本,我将使用: metaerg.pl --dbdir /projects/p30777/db DeMMO1_10.fa --sp --tm --outdir DeMMO1_10 --force 其中DeMMO1_10.fa是文件名,DeMMO1_10是为输出创建的新目录的名称。其中约500个文件分为六个目录。我想运行一些类似于: find . -name '*.fa' -

我想对我目录中扩展名为.fa的所有文件运行脚本。脚本有一个输出目录的参数,我想使用这个参数的文件名

要在一个文件上运行脚本,我将使用:

metaerg.pl  --dbdir /projects/p30777/db DeMMO1_10.fa --sp --tm --outdir DeMMO1_10  --force
其中DeMMO1_10.fa是文件名,DeMMO1_10是为输出创建的新目录的名称。其中约500个文件分为六个目录。我想运行一些类似于:

find . -name '*.fa' -exec metaerg.pl  --dbdir /projects/p30777/db {} --sp --tm --outdir {}  --force \;
但是我不确定应该为--outdir参数设置什么,以便它只传入文件名,而不传入.fa扩展名或路径的其余部分

find . -name '*.fa' -exec sh -c 'metaerg.pl  --dbdir /projects/p30777/db {} --sp --tm --outdir `basename $1 .fa`  --force' sh {} \;

我们创建一个子shell,并将一个
{}
占位符作为
$1
参数从find exec传递给它(为了一致性,最后一个
sh
$0
)。在子shell中,我们获取
$1
参数,并在backticks中使用它来计算
basename()
,并将结果文本作为
outdir
的参数

谢谢@vtronko,我刚刚测试了find-名称'*.fa'-exec basename{}.fa\;它只返回文件名,没有扩展名。你能解释一下为什么我需要在脚本参数的
basename{}.fa
周围加引号吗?这些是反勾号。你可以在这里阅读上面的内容-谢谢@vtronko,看起来它工作不太正常,只是尝试将其作为批处理作业运行,但失败了,错误:[Thu Apr 2 11:50:17 2020]创建新的输出文件夹:./DeMMO1_4.fa[Thu Apr 2 11:50:17 2020]运行:mkdir-p\.\/DeMMO1\u 4\.fa mkdir:无法创建目录。/DeMMO1\u 4.fa:文件存在[Thu Apr 2 11:50:17 2020]无法运行命令:mkdir-p\.\/DeMMO1\u 4\.fa您确定这与Perl脚本本身无关吗?例如,它可能无法处理目录已经存在的情况。也许问题出在复制品的存在上?我不确定您在脚本中使用了什么逻辑,但可能会在由早期输入生成的输出目录中找到walk,并将其作为新输入处理。从我观察到的情况来看,这似乎是一个无关的问题,-force标志的目的是覆盖预先存在的目录,所以不应该有问题。错误看起来像是
basename{}.fa
正在将扩展名作为目录名分配给文件名。