순차적으로 연결하려고 하는 여러 .wav 파일이 있는 폴더가 있지만 이 작업을 최대한 효율적으로 수행하기 위한 bash 명령에 대한 경험이 부족한 것 같습니다. 아시다시피 저는 파일 내용을 명령에 대한 입력으로 사용하는 방법을 모릅니다.
모든 파일 이름을 올바른 순서로 얻습니다.
ls *.wav | sort -V > script
스크립트:
ep1-s1.wav
ep2-s1.wav
ep3-s1.wav
명령에 사용할 각 줄 뒤에 "\"를 추가합니다.
lam script -s " \\" > script2
스크립트 2:
ep1-s1.wav \
ep2-s1.wav \
ep3-s1.wav \
마지막 '\'를 제거합니다.
sed '$ s/.$//' script2 > script3
스크립트 3:
ep1-s1.wav \
ep2-s1.wav \
ep3-s1.wav
이제 이 파일의 내용을 사용하고 싶습니다 sox
. 예를 들면 다음과 같습니다.
sox ep1-s1.wav \
ep2-s1.wav \
ep3-s1.wav output.wav
이 목표를 어떻게 달성할 수 있나요?
이제 하나의 명령으로 이 작업을 수행할 수 있는 방법이 있을 수 있지만 파이프가 어떻게 작동하는지 알 수 없습니다. 방법을 알고 있다면 정말 알고 싶습니다!
답변1
주석에서 언급한 것처럼 버전 정렬( )이 필요하지 않으면 sort -V
간단히 수행할 수 있습니다 sox *wav
. Linux에서는 *wav
파일 이름 확장이 발생하여 알파벳순으로 정렬된 파일 이름 목록이 생성됩니다. 이는 귀하의 로케일에 영향을 받으며, 특히 LC_COLLATE
Google에서 자세한 내용을 확인할 수 있습니다.
필요한 경우 sort -V
이를 처리하는 올바른 방법 은 null로 끝나는 문자열과 배열을 사용하여 공백 및 기타 특수 문자가 포함된 파일 이름을 처리하는 것입니다. 스크립트는 명령의 출력을 sort
배열 에 넣고 sox
해당 목록으로 실행합니다.
#!/bin/bash
unset wav_files
while IFS= read -r -d '' file; do
wav_files+=("$file")
done < <(find . -maxdepth 1 -type f -name "*wav" -print0 | sort -V -z)
if (( ${#wav_files[@]} == 0 )); then
echo "No wav files found"
else
sox -- "${wav_files[@]}"
fi
이는 예상보다 많을 수 있지만 좋은 습관입니다. ;)
답변2
만약에 그리고 만약에sort
파일 이름이 "양호"하고 공백이나 특수 문자(특히 glob 문자)를 포함하지 않습니다. 쉬운 방법은 명령 대체를 실행하는 것입니다.
sox $(printf "%s\n" *.wav | sort -V) output.wav
이것이 printf
하는 일은 각 파일 이름 뒤에 개행 문자()를 추가하는 것입니다 \n
.
(평상시와 같이 파일 이름에 공백이나 탭이 있는 경우( $(...)
확장 후 두 부분으로 분할됨), 개행 문자(이전에 두 부분으로 분할됨 sort
) 또는 전역 문자( *?[]
, 일치하는 파일 이름으로 확장됩니다. ), 따라서 파일 이름을 잘 모르는 경우에는 이 작업을 수행하지 마십시오.https://mywiki.wooledge.org/WordSplitting그리고 언제 큰따옴표가 필요합니까?
답변3
한번 시도해 보세요.
sox `ls *.wax | sort -V`