谁能告诉我如何使用 bash 脚本遍历子文件夹并识别 fastq 文件:
/project/samples/data/intensities/r1.fastq
/project/samples/data/intensities/r2.fastq
/project/samples/sample1.txt
我将仅将基目录 /project/samples/ 传递到我的 bash 脚本,并且我需要遍历子文件夹以获取 fastq 文件。
答案1
和寻找命令:
find /project/samples/ -name "*.fastq"
答案2
在 bash(不是普通的 sh)中,您可以使用**/
通配符模式递归遍历目录。您需要globstar
先设置该选项。例如,要在以下mycommand
每个.fastq
文件上运行/project/samples
:
#!/bin/bash
shopt -s globstar
for x in /project/samples/**/*.fastq; do
mycommand "$x"
done
该功能仅在 bash 4.0 后可用(因此不适用于 OSX 上的默认 bash,但该功能在 zsh 中也可用)。在 4.3 之前的 bash 版本中,请注意它还会遍历目录的符号链接。
如果您需要对所有文件运行单个命令,您可以:
mycommand /project/samples/**/*.fastq
但是,您可能会遇到命令行长度的限制。使用相对路径会有所帮助:
cd /project/samples
mycommand **/*.fastq
如果仍然不适合,您将需要找到另一个解决方案来完成您需要做的任何事情,这不涉及立即将所有文件名作为参数传递给该命令。
答案3
#!/bin/bash
if [ ! -d "$1" ]; then
printf 'Not a directory: %s\n' "$1" >&2
exit 1
fi
find "$1" -type f -name "*.fastq" -print
这是一个小脚本,它将简单地列出给定目录中的 fastq 文件。
如果你想对每个文件执行一个命令,最简单的方法是find
将
find "$1" -type f -name "*.fastq" -exec utility {} ';'
在哪里utility
有一些程序在命令行上获取 fastq 文件的路径({}
将替换 fastq 文件的路径)。