我的想法是制作一个脚本,给出所有子目录(在我的例子中是〜/ MUSIC,但在我妻子的mac上是不同的 - >艺术家/专辑)。在稍后的阶段,我想将所有 .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 部分具有相同的目标。
谢谢@彼得·科德斯有关使用“while”而不是“for-loop”阅读行的信息; http://mywiki.wooledge.org/BashFAQ/001和http://mywiki.wooledge.org/DontReadLinesWithFor 当然,对于您的其他反应来说,有这么多有用的输入真是太棒了。
@马修·博恩萨克… 一个漂亮又简单的脚本,而不是我的想法。
@索尔·奥尔特加,这是我的输出:(当然是树)
./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 常见问题解答。
音频文件的名称中通常含有空格,因此这对您来说是一个问题。
一种方法是使用 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。
答案2
Peter 的答案的“查找”版本是不获取子目录而是实际进行所有转换,如下所示:
转换_if_no_mp4 () { wav_file=${1} mp4_file="${wav_file%.wav}.mp4" 如果 [[ ! -e ${mp4_file} ]];然后 ffmpeg -i "$wav_file" -c:a libfdk_aac -b:a 96k "$mp4_file" 菲 } 导出-f Convert_if_no_mp4 目录=~/音乐 查找 ${dir} -type f -name "*.wav" -exec bash -c 'convert_if_no_mp4 "{}"' \;
我怀疑这就是您真正想要的(实际上正在进行转换),但是如果您确实想出于某种原因对所有子目录进行操作,您可以从这样的事情开始:
do_stuff_with_subdir () { echo "用\"${1}\"做某事" } 导出-f do_stuff_with_subdir 目录=~/音乐 查找 ${dir} -type d -exec bash -c 'do_stuff_with_subdir "{}"' \;
答案3
要将命令的整个输出放入 BASH 数组中,只需执行以下操作:
array=( $( command ) )
保留整个while read
部分。但要小心名称中的特殊字符。
答案4
检查您的第一部分的以下代码:
#!/bin/bash
extFROM=”.wav”
extTO=”.mp4”
dir="˜/music"
tree -d
cnt=1
array
echo " part 1"
find $dir -type d | while read line
do
array[ $cnt ]="$line"
echo ""${cnt}" : ${array[ $cnt ]}"
let cnt++;
done
对于第二部分,您能否提供更多信息,例如获取所有子目录后您想要执行的操作。