12

以下は現在のフォルダー内で正常に機能しますが、サブフォルダーもスキャンしたいと思います。

for file in *.mp3

do

echo $file

done
4

5 に答える 5

9

この猫の皮を剥ぐ方法はたくさんあります。自分で 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 ループに展開する最初のバージョンでは失敗します。シェルの拡張には制限があるため、ある時点で機能します。

于 2013-04-10T15:42:37.820 に答える
5

これは、ほとんどのファイル名 (スペースを含む) で機能しますが、改行、タブ、または二重スペースでは機能しません。

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
于 2013-04-10T15:42:43.110 に答える
-1

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:配列を使用すると、名前にスペースが含まれるファイルに対してコマンドが安全になります。

于 2013-04-10T15:41:57.223 に答える