複数のディレクトリでbashスクリプトを実行するには?

複数のディレクトリでbashスクリプトを実行するには?

conv.sh現在のディレクトリのMP3ファイルを繰り返しOGGに変換するスクリプトがあります。また、{F1、F2、...、F20}のある複数のディレクトリがあります。このすべてのディレクトリで/path/to/Files/どのように実行する必要がありますか?conv.sh

答え1

この試み

curdir=$(pwd)
for folder in /path/to/Files/*; do 
  [ -d "$folder" ] && cd "$folder" && ./conv.sh
done
cd $curdir

または、あなたがそうすると仮定すると、/path/to/Files/これも動作します

for f in *; do [ -d "$f" ] && cd "$f" && ./conv.sh; done; cd ..

F{1..20}より良い精度を得るには、代替を使用できます*

答え2

この試み:

./conv.sh /path/to/Files/F[0-9]*/*.mp3

このコマンドは、Fおよび数字で始まるディレクトリのmp3のみを処理します。

答え3

xargs または GNU 並列処理を使用できます。

echo /path/to/Files/F{1..20} | tr ' ' '\n' |
  xargs -L conv.sh

または:

echo /path/to/Files/F{1..20} | tr ' ' '\n' |
  parallel conv.sh

編集 - スペースを賢く処理

Oleが指摘したように、上記の方法のいずれもスペースを正しく処理しません。つまり、dir name2つの別々の引数として扱われ、ディレクトリ名に改行文字が含まれている場合も同じ問題が発生します。

これらの問題を解決するための最良の方法は、例えばGNU findを使用してnullを区切り文字として使用することです。

find /path/to/Files -mindepth 1 -maxdepth 1 -type d -regex '.*/F[0-9]*' -print0 |
  parallel -0 conv.sh

関連情報