誰でも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ファイルパスを置き換えます)。