• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:あるディレクトリの.wma を全て.mp3 に)

【スクリプト作成】あるディレクトリの.wmaを全て.mp3に変換する方法

このQ&Aのポイント
  • あるディレクトリにある.wmaファイルを全て.mp3ファイルに変換するスクリプトを作成したいです。
  • ls.txtにディレクトリの内容を保存し、.wmaファイルを.mp3ファイルに変換する方法を教えてください。
  • .wmaの前を変数に代入する方法を知りたいです。また、.wma以外のファイルでも対応できる方法が良いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

  (場合によってはリストを手動加工するので?) ls.txt を用意するうという条件下で cat | while read するシェルの例をあげましたが、 ご指摘の通り、この方法だと大量のファイルや、長いファイル名があるとき、 シェルのコマンドラインの長さ制限に引っかかってしまいますね。 そういう場合を考慮するなら、 ワイルドカード使わないで find ./ -name '*.wma' -print | while read line;do ffmpeg -i ${line} ${line%.*}.mp3;done かな。

noname#214079
質問者

お礼

ネストされた構文がよく分からなかったのですが、 中身が 2 7 となっている bit.txt を用意した場合は $ cat bit.txt | while read line;do let line="${line} + 1" ; echo $line ;done 3 8 と、きちんとうまくいきました。 どうもありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (7)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

#7 のところ, 「ネストされた構文」ってのはどれのことでしょうか? ついでに ls | grep wma > ls.txt だと「拡張子が .wma でないもの」もリストアップされます. grep '\\.wma$' なら大丈夫かな?

noname#214079
質問者

お礼

ありがとうございます。 > #7 のところ, 「ネストされた構文」ってのはどれのことでしょうか? すみません、書き間違えました。次の文ですが、 $ cat bit.txt | while read line;do let line="${line} + 1" ; echo $line ;done while ループの中に複数の文が入っているもの、 という意味で書いたつもりでした。 do ~ done のなかに 単に複数の文を ; でつないで書けば良い、 ということが分からなかったのです。 grep '\\.wma$' grep '\.wma$' のどちらを試してもターミナルが固まってしまい、反応がありません。

noname#214079
質問者

補足

すみません、 ls | の部分を最初に付けずに $ grep '\\.wma$' $ grep '\.wma$' と入力するというバカなことをやってしまいました。 a.pdf pdf_in_name.txt の2つのファイルが存在するディレクトリでのコマンド実行結果は $ ls | grep pdf a.pdf pdf_in_name.txt $ ls | grep '\\.pdf$' $ ls | grep '\\.pdf' $ ls | grep '\.pdf$' a.pdf $ ls | grep '\.pdf' a.pdf となりました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

本題からいくと, find の結果は #2 の cat ls.txt 相当なので, cat ls.txt の代わりに「find 以下省略」を入れればいい. 余談については「find が何をするか」を考えればいい. find は 1. 指定した場所から 2. 指定した条件を満たすファイル (やディレクトリなど) に対して 3. 指定した動作を実行する というプログラムで, 条件と動作については何も与えないときのデフォルトは 2'. すべてのファイル (やディレクトリなど) に対して 3'. そのパスを表示する になってる (この辺まではマニュアルに書いてあるはず). これを踏まえつつ find *.wma を見ると, 場所として *.wma (を展開したもの) が与えられているが条件や動作が書かれていないのでデフォルトの処理をする. つまり *.wma (を展開したもの) 以下のすべてのファイル (やディレクトリなど) を表示するわけだから, 結果として ls -1R *.wma と似たような動作になる.

noname#214079
質問者

お礼

おかげさまでよく理解できました。 詳しく解説していただき、誠にありがとうございます。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

まず, その find の使い方は変だ. マニュアルで確認するように. 特に -name あたり. 例えば ls *.wma としたとき, ワイルドカードはシェルが展開する. で, もしいっぱいファイルがあって「コマンドラインの長さの限界」を越えたらどうなるか知ってる? コマンドラインの長さの限界を越えないことが確実だとしても, ls > ls.txt みたいにわざわざファイルを作る必要はあるんでしょうか. もちろん, ファイルを作るにしても (「コマンドラインの長さ」は関係なく) ls よりは find の方が適切な選択ではある.

noname#214079
質問者

お礼

ありがとうございます。 「コマンドラインの長さ限界」の問題を考慮すると、 正しくは $ find -name '*.wma' ですね。 しかし、 $ find *.wma でなぜこちらが期待する結果が出たのかよく分からないです。 (本筋から外れたことですが) > ls > ls.txt > みたいにわざわざファイルを作る必要はあるんでしょうか. シェルスクリプトの知識が不足していますので、 ls.txt などを作らずに処理するやり方が分からないのです。 find -name '*.wma' | read line ; var=${line%.*} ; ffmpeg -i ${line} ${var}.mp3 find -name '*.wma' | var=${line%.*} ; ffmpeg -i ${line} ${var}.mp3 などではいまくいきませんし。

noname#214079
質問者

補足

ls を使う場合でも ls | grep wma > ls.txt とすれば問題ないですね。

すると、全ての回答が全文表示されます。
回答No.4

このサイトって、インデント表示する方法ないみたいないので、 行頭に全角空白入れて書いてしまったけど、 コピペするんじゃなくて半角に。

noname#214079
質問者

お礼

回答No.2で 全角とか半角とか書いてあるのが何のことかわからなかったのですが、 行頭に全角スペースが入れてあったのですね。 そこを修正したら、ちゃんと動作しました。 どうもありがとうございました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「.wma の前を変数 var に代入する」のは #2 の通りでいいんだけど ls *.wma はいただけない. ・単に for でまわす ・find を使う のどちらかにすべきだ.

noname#214079
質問者

お礼

ありがとうございます。 > 「.wma の前を変数 var に代入する」のは #2 の通りでいいんだけど ここが今引っかかっている所です。 自分でも少し調べてみます。 > ls *.wma > はいただけない. ターミナル上では $ find *.wma 01.wma 02.wma $ ls *.wma 01.wma 02.wma ですが、 $ ls *.wma > ls.txt $ cat ls.txt 01.wma 02.wma というように、ちゃんと一行にファイルがひとつづつ出力されていて問題ないようです。

すると、全ての回答が全文表示されます。
回答No.2

ls *.wma > ls.txt cat ls.txt | while read line ; do  var=${line%.*}  ffmpeg -i ${line} ${var}.mp3 done かな。 (全角空白は半角に) 拡張子を足したいときは、 1行目を  ls *.wma *.wav > ls.txt といった感じにするだけです。 ただ、listファイルというのが、音声ファイルや動画ファイルでなく、 再生順を記載したプレイリスト(単なるテキストファイル)のことでしたら、 エンコード形式を変換する対象にはならないのでは?

noname#214079
質問者

お礼

ありがとうございます。 やってみたのですが、ffmpeg がインストールされているのにうまくいきません。 cat ls.txt | while read line ; do  var=${line%.*} echo $line,$var  ffmpeg -i ${line} ${var}.mp3 done としたスクリプトの結果が次のようになります。 $ bash script.sh script.sh: 行 2: $'\343\200\200var=01': コマンドが見つかりません 01.wma, script.sh: 行 4: $'\343\200\200ffmpeg': コマンドが見つかりません script.sh: 行 2: $'\343\200\200var=02': コマンドが見つかりません 02.wma, script.sh: 行 4: $'\343\200\200ffmpeg': コマンドが見つかりません > なるべく . の後が3文字の .mp3 だけでなく .list などでも通用する方法を知りたいです。 > listファイルというのが、音声ファイルや動画ファイルでなく、 > 再生順を記載したプレイリスト(単なるテキストファイル)のことでしたら、 > エンコード形式を変換する対象にはならないのでは? .list 自体に特に意味はなく、 別のコマンドで別の処理をする時にもすぐに応用が効くやり方を教えて下さい、 という意味で書いたのですが、言葉足らずだったようで分かりにくかったですね。 申し訳ありません。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

使ってるシェルはなに?

noname#214079
質問者

お礼

ありがとうございます。 debian wheezy(7.7) を使用していますので、bash です。

すると、全ての回答が全文表示されます。

関連するQ&A