以下は現在のフォルダー内で正常に機能しますが、サブフォルダーもスキャンしたいと思います。
for file in *.mp3
do
echo $file
done
この猫の皮を剥ぐ方法はたくさんあります。自分で find コマンドの呼び出しを使用します。
for file in $(find . -name '*.mp3') do
echo $file
TITLE=$(id3info "$file" | grep '^=== TIT2' | sed -e 's/.*: //g')
ARTIST=$(id3info "$file" | grep '^=== TPE1' | sed -e 's/.*: //g')
echo "$ARTIST - $TITLE"
done
ファイル名にスペースが含まれている場合は、-print0
検索オプションを使用するのが最善です。1つの可能な方法はこれです:
find . -name '*.mp3' -print0 | while read -d $'\0' file
do
echo $file
TITLE=$(id3info "$file" | grep '^=== TIT2' | sed -e 's/.*: //g')
ARTIST=$(id3info "$file" | grep '^=== TPE1' | sed -e 's/.*: //g')
echo "$ARTIST - $TITLE"
done
または、保存して復元することもできますIFS
。David W. のコメントに感謝します。特に、while
ループ バージョンには非常に多数のファイルを正しく処理できるという利点もありますが、$(find)
a を for ループに展開する最初のバージョンでは失敗します。シェルの拡張には制限があるため、ある時点で機能します。
これは、ほとんどのファイル名 (スペースを含む) で機能しますが、改行、タブ、または二重スペースでは機能しません。
find . -type f -name '*.mp3' | while read i; do
echo "$i"
done
これはすべてのファイル名で機能します。
find . -type f -name '*.mp3' -print0 | while IFS= read -r -d '' i; do
echo "$i"
done
ただし、コマンドを 1 つだけ実行したい場合は、次のxargs
例を使用できます。
find . -type f -name '*.mp3' -print0 | xargs -0 -l echo
find コマンドを探しているようです。私はこれをテストしていませんが、これらの行に沿った何か:
files=(`find . -name *.mp3`)
for file in "${files[@]}"; do
echo $file TITLE="id3info "$file" | grep '^=== TIT2' | sed -e 's/.*: //g'" ARTIST="id3info "$file" | grep '^=== TPE1' | sed -e 's/.*: //g'"
done
EDIT:配列を使用すると、名前にスペースが含まれるファイルに対してコマンドが安全になります。