Bash 一个方便的脚本,用于逐个为目录中的所有文件执行程序

Bash 一个方便的脚本,用于逐个为目录中的所有文件执行程序,bash,Bash,我有61个.fastq文件,我想分别为每个文件运行一个应用程序,生成61个输出文件,那么如何编写脚本以避免列出所有61个文件呢?我尝试了几个简单的脚本,因为我不是专业人士,但在运行时,程序无法打开fastq文件,然而,当我只为一个文件运行程序时,打开它没有问题。 你认为,从技术上讲,下面的脚本是正确的,应该有效吗?还是我遗漏了什么 samples="$(ls data)" echo ${samples} | tr " " "\n" | while read sample; do gsna

我有61个.fastq文件,我想分别为每个文件运行一个应用程序,生成61个输出文件,那么如何编写脚本以避免列出所有61个文件呢?我尝试了几个简单的脚本,因为我不是专业人士,但在运行时,程序无法打开fastq文件,然而,当我只为一个文件运行程序时,打开它没有问题。 你认为,从技术上讲,下面的脚本是正确的,应该有效吗?还是我遗漏了什么

samples="$(ls data)"
echo ${samples} | tr " " "\n" | while read sample; do
    gsnap -D ./cinxia  ./data/${sample}.fastq ; done


我希望程序gsnap对我的61个fastq文件中的每一个都运行,并且每次都以相同的文件名给我一个结果。第二个更好,嗅探ls的输出是不好的。我认为,如果文件名中有某些字符,您可能会遇到麻烦,但只要您知道输入文件名是正常的,就可以不使用引号,如下所示:

for sample in /data/*.fastq; do
    gsnap -D ./cinxia "./data/${sample}.fastq"
done
例如,如果您的文件名中有空格,则引号将使其如此:

gsnap -D ./cinxia "./data/file name with spaces.fastq"
您可以看到,如果没有引号,命令行将看到很多单词而不是一个文件。在bash中处理引用和扩展时要小心,这很混乱!在某些情况下,即使使用引号,也会得到不好的结果


如果您有一个名为badfile的文件,会发生什么;rm-rf/?

第二个更好,嗅探ls的输出是不好的形式。我认为,如果文件名中有某些字符,您可能会遇到麻烦,但只要您知道输入文件名是正常的,就可以不使用引号,如下所示:

for sample in /data/*.fastq; do
    gsnap -D ./cinxia "./data/${sample}.fastq"
done
例如,如果您的文件名中有空格,则引号将使其如此:

gsnap -D ./cinxia "./data/file name with spaces.fastq"
您可以看到,如果没有引号,命令行将看到很多单词而不是一个文件。在bash中处理引用和扩展时要小心,这很混乱!在某些情况下,即使使用引号,也会得到不好的结果


如果您有一个名为badfile的文件,会发生什么;RM- R//

< P>虽然IZZY的回答是正确的和直截了当的,如果你正在寻找一个性能提升,等待正确性检查和基准测试,你可能想考虑以下方法:

find data -name *.fastq -type f -maxdepth 1 -print0 2>/dev/null \
  | xargs -0 -n1 -I{} -P"$(nproc)" gsnap -D ./cinxia "{}"

xargs-p可以帮助将gsnap调用并行化到不同的级别,nproc会告诉它当前进程可用的处理单元数量可能少于在线处理器的数量。

虽然izzy的答案是正确和直接的,但如果您希望在进行正确性检查和基准测试之前提高性能,您可能希望考虑以下方法:

find data -name *.fastq -type f -maxdepth 1 -print0 2>/dev/null \
  | xargs -0 -n1 -I{} -P"$(nproc)" gsnap -D ./cinxia "{}"

xargs-p可以帮助将gsnap调用并行化到不同的级别,nproc会告诉它当前进程可用的处理单元数量可能少于联机处理器的数量。

欢迎使用堆栈溢出!看看这本书。这两个脚本可能都能工作,所以不清楚问题出在哪里。请发布错误消息。请参阅和以供参考。这是打字错误吗${sample}。我想我抓到你了!我不应该提到${sample}.fastq,我应该只提到${sample},因为我注意到它添加了一个额外的.fastq!是吗?是的,这正是我的意思,你可能会发现它最容易用于像这样的任务。欢迎使用堆栈溢出!看看这本书。这两个脚本可能都能工作,所以不清楚问题出在哪里。请发布错误消息。请参阅和以供参考。这是打字错误吗${sample}。我想我抓到你了!我不应该提到${sample}.fastq,我应该只提到${sample},因为我注意到它添加了一个额外的.fastq!对吗?是的,这正是我的意思,你可能会发现使用Make来完成这样的任务是最容易的。如果你试图使用它的值来计算一个字符串,那么你的最后一个就成了问题。普通的分词和路径名扩展不会尝试删除任何内容。即使使用引号,有时也会用时髦的文件名得到不好的结果。这仅适用于可以解释为选项的文件名,如-rf foobar。在这种情况下,只需在文件名rm-$sample前加一个双破折号,或者像本例中那样使用点斜杠即可。@wjandrea和chepner感谢您的澄清。如果手头没有外壳和手册,我通常记不起各种拆分和扩展的顺序,因此我倾向于过于谨慎。我将编辑这篇文章以澄清问题。如果您试图评估使用其值生成的字符串,那么您的最后一篇文章只是一个问题。普通的分词和路径名扩展不会尝试删除任何内容。即使使用引号,有时也会用时髦的文件名得到不好的结果。这仅适用于可以解释为选项的文件名,如-rf foobar。在这种情况下,只需在文件名rm-$sample前加一个双破折号,或者像本例中那样使用点斜杠即可。@wjandrea和chepner感谢您的澄清。如果手头没有外壳和手册,我通常记不起各种拆分和扩展的顺序,因此我倾向于过于谨慎。我会编辑这篇文章 澄清。