명령 출력에서 ​​모든 하위 디렉터리의 배열을 만듭니다.

명령 출력에서 ​​모든 하위 디렉터리의 배열을 만듭니다.

내 생각은 모든 하위 디렉토리를 제공하는 스크립트를 만드는 것입니다(내 경우에는 ~/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를 참조하세요.

오디오 파일에는 이름에 공백이 있는 경우가 많으므로 이것이 문제가 될 수 있습니다.

한 가지 접근 방식은 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의 대답의 "찾기" 버전은 하위 디렉터리를 가져오지 않고 실제로 다음과 같이 모든 변환을 수행하는 것입니다.

Convert_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

두 번째 부분에서는 모든 하위 디렉터리를 가져온 후 수행할 작업과 같은 추가 정보를 제공할 수 있습니까?

관련 정보