Unix如何循环遍历目录,将输出发送到具有输入文件基本名称的另一个目录

Unix如何循环遍历目录,将输出发送到具有输入文件基本名称的另一个目录

我是一个不常使用 UNIX 的用户,我确信这对于任何普通用户来说都是相当微不足道的,所以我对此表示歉意。我有以下代码:

 for file in /home/sub1/samples/aaa*/*_novoalign.bam
      do
           samtools depth -r chr9:218026635-21994999 *_novoalign.bam < $file > /home/sub2/sub3/${file}.out 
      done

我希望输出将被发送到 sub2/sub3/ 中的文件,其名称类似于输入文件夹。它说“没有文件或目录”。理想情况下,我希望将其发送到此处,删除“_novoalign.bam”并添加新的结尾,例如“_output.txt”。有小费吗?

ps 我无权写入找到输入文件的目录。

答案1

您需要删除路径,然后删除不需要的扩展名:

base=${file##*/}
newfile=${base%_novoalign.bam}_output.txt

然后使用:

... > "/home/sub2/sub3/$newfile"

在此处查看 Shell 参数扩展以了解其他选项:

GNU Bash 文档

答案2

cd /home/sub1/samples
for file in aaa*/*_novoalign.bam; do
    target_file="${file%_novoalign.bam}_output.txt"
    samtools depth -r chr9:218026635-21994999 <"$file" >"$target_file"
done

相关内容