通过命令的输出创建所有子目录的数组

通过命令的输出创建所有子目录的数组

我的想法是制作一个脚本,给出所有子目录(在我的例子中是〜/ 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/001http://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/001http://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

对于第二部分,您能否提供更多信息,例如获取所有子目录后您想要执行的操作。

相关内容