各ディレクトリに移動して特定のファイルに対してコマンドを実行するにはどうすればよいですか?

各ディレクトリに移動して特定のファイルに対してコマンドを実行するにはどうすればよいですか?

parent_directoryの各ディレクトリを繰り返し、特定のファイルに対してコマンドを実行するbashスクリプトを作成する方法。

ディレクトリ構造は次のとおりです。

Parent_dir/
  dir1/
   acc.bam
  dir2/
   acc.bam
  dir3/
   acc.bam
... around 30 directories

これが私が使用したいコマンドです:

java8 -jar /picard.jar CollectRnaSeqMetrics REF_FLAT=/refFlathuman.refflat STRAND_SPECIFICITY=NONE I=acc.bam O=output

ベストアンサー1

一般的な慣用語は

for d in Parent_dir/*/
do
     (cd "$d" && $command)
done

ループforは、.txtファイルの各ディレクトリに対して一度だけ直接実行されますParent_dir。各ディレクトリに対してサブシェルが作成されます。サブシェルからそのディレクトリに変更しようとします(たとえば、十分な権限がないと失敗する可能性があります)、成功した場合はコマンドを実行します。成功するかどうかはcd親シェルに影響を与えないため、間違った場所を心配する必要はありません。


もっと頑丈にしたいなら

    (cd "$d" && test -r acc.bam &&  $command)

acc.bamディレクトリが存在し、読み取り可能であることを確認してください。test -w .書き込み不可能なディレクトリでコマンドを実行したくない場合は、を追加することもできます。


PS上記のどれもBashに限定されません。 /bin/sh はかなり簡単に使用できます。

おすすめ記事