コマンド出力からすべてのサブディレクトリの配列を作成します。

コマンド出力からすべてのサブディレクトリの配列を作成します。

私の考えは、すべてのサブディレクトリを提供するスクリプトを作成することです(私の場合は〜/ 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より劣っています。

おすすめ記事