このコマンドをどのように繰り返すことができますか?

このコマンドをどのように繰り返すことができますか?

ここでUbuntu Linuxを実行します。

PWDですべてのmp3ファイルを検索し、mp3infoを使用して各持続時間を分単位で取得し、合計し、pwd内のすべてのmp3の合計持続時間を印刷するターミナルコマンドがあります。

for file in *.mp3; do 
  mp3info -p "%S\n" "$file"
done | paste -sd+ | sed 's+\(.*\)+(\1)/60+' | bc

出力例:

$ for file in *.mp3; do 
  mp3info -p "%S\n" "$file"
done | paste -sd+ | sed 's+\(.*\)+(\1)/60+' | bc
47

したがって、PWDには47分のmp3があります。

私はこれをすべてのサブディレクトリに再帰し、名前を印刷し、各フォルダ内のすべてのmp3の合計持続時間を一覧表示するbashスクリプトにしたいと思います。たとえば、次のようになります。

foldernameA 
45 
foldernameB 
89 
foldernameC 
17

など。

私が試したこと( "durations.sh"):

#!/bin/bash
find . -type d -execdir sh -c 'for file in *.mp3; 
do 
  mp3info -p "%S\n" "$file"; 
done 
| paste -sd+ | sed 's+\(.*\)+(\1)/60+' | bc

しかし、これは悲惨に失敗します。

$ ./durations.sh
./durations.sh: line 6: syntax error near unexpected token `('
./durations.sh: line 6: `| paste -sd+ | sed 's+\(.*\)+(\1)/60+' | bc'

私は明らかに私が何をしているのかわかりません。

ベストアンサー1

forループを直接使用できますshopt -s グロスター:

グローバルスター

設定されている場合、ファイル名拡張子のコンテキストで使用される "**"パターンは、すべてのファイルとゼロ個以上のディレクトリとサブディレクトリと一致します。パターンの後に「/」が続くと、ディレクトリとサブディレクトリのみが一致します。

shopt -s globstar

d=0;
for file in **/*.mp3; do
  d=$((d + $(mp3info -p "%S" "$file")))
done
mins=$(echo "$d / 60" | bc)
secs=$(echo "$d % 60" | bc)

echo "Total $mins minutes and $secs seconds"

おすすめ記事