使用 bash 脚本遍历子文件夹

使用 bash 脚本遍历子文件夹

谁能告诉我如何使用 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 文件的路径)。

相关内容