私の考えは、すべてのサブディレクトリを提供するスクリプトを作成することです(私の場合は〜/ MUSICですが、妻のMacでは異なります - > Artists / Albums)。後の段階でまだ存在しない場合は、すべての.wav拡張子をmp4に変換したいと思います。
しかし、すでにコマンド出力を文字列配列に入れるのに問題があります。
#!/bin/bash
extFROM=”.wav”;
extTO=”.mp4”;
dir="˜/music";
tree -d
cnt=1;
array;
echo " part 1";
find $dir -type d | while read line
#ls -d -1 | while read line
do
array[ $cnt ] = "$line";
echo "${cnt} "; # : ${array[ $cnt ] ";
let cnt++;
done
echo " part 2";
array=`awk '{print $1}' <find $dir -type d`
for i in array;
do
echo "${i} ";
done
私の遅い答えのために遅れたことを謝罪します。パート1とパート2の目標は同じです。
ありがとう@petercordes行を読むために「for-loop」の代わりに「while」を使用する方法に関する情報。 http://mywiki.wooledge.org/BashFAQ/001そしてhttp://mywiki.wooledge.org/DontReadLinesWithFor もちろん、他の答えにも役立つ意見が多すぎて良いです。
@マシュー本色...素敵でシンプルなスクリプトですが、私の考えではありません。
@solortega、これが私の結果です:(もちろんツリー)
./test.sh: line 15: array: command not found
part 1
find: ˜/music: No such file or directory
part 2
./test.sh: line 28: find: No such file or directory
array
だからこれは私のスクリプトに関連しており、ディレクトリが存在します。
ベストアンサー1
バラよりhttp://mywiki.wooledge.org/BashFAQ/001そしてhttp://mywiki.wooledge.org/DontReadLinesWithForスペースやその他の特殊文字を含む可能性のある行を読む方法を学びます。
スクリプトでテキストを処理する方法には多くの問題があります。単語噴射の影響を受けたくない状況がたくさんあります。詳しくはWooledge FAQをご覧ください。
オーディオファイルには名前にスペースがあることが多いため、これが問題になる可能性があります。
1つのアプローチは、Bashのextglob機能を使用してfind
出力の解析を防ぐことです。 (find -exec ... {} +
別の方法になります)。
shopt -s extglob
for wav in **/*.wav; do
mp4="${wav%.wav}.mp4" # strip off the .wav suffix, tack on .mp4
if ! [[ -e "$mp4" ]]; then
ffmpeg -i "$wav" -c:a libfdk_aac -b:a 96k "$mp4"
fi
done
ffmpegに注意してください他のAACエンコーダはまだlibfdkより劣っています。。