우분투 셸 중괄호 확장 - sox 명령과 혼동

우분투 셸 중괄호 확장 - sox 명령과 혼동

여러 하위 디렉터리를 검색하고 모든 .mp3 파일을 .al 파일로 변환하고 싶습니다. 이것이 내가 하는 방법이다:

find . -name '*.mp3' -type f -print0 | xargs -0 -t -r -I {} sox {} -r 8000 -c1 -e a-law {}.al lowpass 4000 compand 0.02,0.05 -60,-60,-30,-10,-20,-8,-5,-8,-2,-8 -8 -7 0.05

하지만 이로 인해 filename.mp3.al 파일이 남게 되므로 다음과 같이 합니다.

rename 's/.mp3.al$/.al/' ./**/*.mp3.al

조금 투박해 보이지만 이전 .mp3 확장자를 제거하기 위해 확장자를 수행하는 방법을 모르겠습니다.

(궁금하신 분들이 계시다면 이 시스템은 Asterisk 13.8.2 PBX 시스템에 있습니다. 자체 변환기가 내장되어 있고 mp3도 재생할 수 있다는 것을 알고 있지만 두 솔루션 모두 기본 법률만큼 좋지는 않습니다!)

답변1

AFAIK, 이 경우에는 {}실제로 "쉘 중괄호"가 아닙니다(의미에서).버팀대 확장예) 매개변수에 대한 텍스트 자리 표시자일 뿐입니다. 따라서 이를 쉘 명령에 전달하고 쉘의 인수 대체 기능을 사용하여 이름을 수정할 수 있습니다.

sh -c 'for f; do somecommand "$f" "${f%.*}.al"; done' sh {}

더 간단한 명령으로 설명하려면 다음을 입력하십시오.

$ tree
.
├── dir
│   ├── other file.mp3
│   └── some file.csv
├── other file.txt
└── some file.mp3

1 directory, 4 files

그 다음에

$ find . -name '*.mp3' -print0 | xargs -0 -I {} sh -c 'for f; do printf "%s --> %s\n" "$f" "${f%.*}.al"; done' sh {}
./dir/other file.mp3 --> ./dir/other file.al
./some file.mp3 --> ./some file.al

또는 (귀하의 시스템이 find이를 지원하는 경우)

$ find . -name '*.mp3' -exec sh -c 'for f; do printf "%s --> %s\n" "$f" "${f%.*}.al"; done' sh {} +
./dir/other file.mp3 --> ./dir/other file.al
./some file.mp3 --> ./some file.al

관련 정보