を使ってサブフォルダのオーディオファイルを分割したいと思いますSox
。この基本スクリプトがあります。
#!/bin/bash
# Example: sox_merge_subfolder.sh input_dir/ output_dir/
# Soure directory with subfolder that contains splitted mp3
input_dir=$1
# Set the directory you want for the merged mp3s
output_dir=$2
# make sure the output directory exists (create it if not)
mkdir -p "$output_dir"
find "$input_dir" -type d -print0 | while read -d $'\0' file
do
echo "Processing..."
cd "$file"
output_file="$output_dir/${PWD##*/} - Track only.mp3"
echo " Output: $output_file"
sox --show-progress *.mp3 "$output_file"
done
うまくいきますが、mp3
このようなエラーを避けるために、インクルードのみを使用するように切り替えたいと思います。sox FAIL formats: can't open input file '*.mp3': No such file or directory
動作するこのコマンドがありますfind . -maxdepth 2 -name "*.mp3" -exec dirname {} \; | uniq
。ただし、パスは相対的なため、既存のスクリプトに含めることはできません。
ベストアンサー1
それでもを使用してfind
すべてのディレクトリを見つけることができますが、ディレクトリをインポートするループはMP3ファイルをテストする必要があります。
#!/bin/sh
indir=$1
outdir=$2
mkdir -p "$outdir" || exit 1
find "$indir" -type d -exec bash -O nullglob -c '
outdir=$1; shift
for dirpath do
mp3files=( "$dirpath"/*.mp3 )
[[ ${#mp3files[@]} -eq 0 ]] && continue
printf -v outfile "%s - Track only.mp3" "${dirpath##*/}"
sox --show-progress "${mp3files[@]}" "$outdir/$outfile"
done' bash "$outdir" {} +
このスクリプトは短いインラインスクリプトを/bin/sh
実行しfind
て実行します。スクリプトはディレクトリの一括パス名として呼び出されますが、最初の引数は出力ディレクトリのパス名になります。これはスクリプトから受け取り、パラメータは場所パラメータのリストから移動され、ディレクトリパス名のリストだけが残ります。find
bash
bash
outdir
bash
その後、インラインスクリプトはこれらのディレクトリを繰り返し、*.mp3
各ディレクトリのglobを展開して、配列に保存するMP3ファイルのパス名のリストを生成しますmp3files
。
このスクリプトを使用しているため、-O nullglob
一致するファイル名がない場合は配列が空であるため、-eq 0
この場合はテストを使用して次の繰り返しに進みます。
次に、現在のディレクトリパス名で出力ファイル名を設定し、sox
収集したMP3ファイル名に対してコマンドを実行します。
また見なさい: