特定のファイル拡張子を含むフォルダにループするにはどうすればよいですか?

特定のファイル拡張子を含むフォルダにループするにはどうすればよいですか?

を使ってサブフォルダのオーディオファイルを分割したいと思います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て実行します。スクリプトはディレクトリの一括パス名として呼び出されますが、最初の引数は出力ディレクトリのパス名になります。これはスクリプトから受け取り、パラメータは場所パラメータのリストから移動され、ディレクトリパス名のリストだけが残ります。findbashbashoutdirbash

その後、インラインスクリプトはこれらのディレクトリを繰り返し、*.mp3各ディレクトリのglobを展開して、配列に保存するMP3ファイルのパス名のリストを生成しますmp3files

このスクリプトを使用しているため、-O nullglob一致するファイル名がない場合は配列が空であるため、-eq 0この場合はテストを使用して次の繰り返しに進みます。

次に、現在のディレクトリパス名で出力ファイル名を設定し、sox収集したMP3ファイル名に対してコマンドを実行します。

また見なさい:

おすすめ記事