파이프에서 xargs를 사용하는 방법이 있습니까?


15

폴더로 이동 된 flac 파일을 다른 폴더의 mp3로 자동 변환하려고합니다.

내 현재 코드 줄은 다음과 같습니다.

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test |  xargs -I x flac -cd x - | lame -b 320 - /media/1tb/x.mp3

이것이 지금까지 어떻게 작동하는지 설명하기 위해, inotifywait는 경로로 이동 한 파일을 파이프로 경로와 파일 이름을 출력하여 재귀 적으로 ~ / test를 모니터링합니다. xargs는이 이름을 사용하여 x를 파일 이름으로 바꾸고 파일을 다른 파이프로 디코딩하여 적절한 flac 명령을 작성합니다. 새로운 파이프 라메에서는 flac의 출력을 / media에서 mp3로 처리합니다. xargs가 파이프를 가로 질러 lame 명령의 x를 바꾸거나 어떤 식 으로든 두 명령이 액세스 할 수있는 변수로 보내길 원합니다. 나는 명명 된 파이프와 그 재즈로 엉망을 시도했지만 두 명령 사이에 실제 데이터가 파이프되어 있다는 사실이 저를 방해합니다.

답변:


16

올바르게 이해하면 flac … | lame …각 입력 줄에 대해 하나의 인스턴스 를 시작하고 입력을 두 명령의 인수에 보간하려고합니다.

xargs파이프 라인을 시작 해야하므로 파이프 라인, 즉 셸을 만들 수있는 프로그램을 시작해야합니다.

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
xargs -l sh -c 'flac -cd "$0" - | lame -b 320 - "/media/1tb/$0.mp3"'

또는 호출 쉘이 라인을 하나씩 읽고 파이프 라인을 실행하게하십시오.

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
while IFS= read -r file; do
  flac -cd "$file" - | lame -b 320 - "/media/1tb/$file.mp3"
done

형식 %w%f은 앞에 추가 /media/1tb하고 추가 하는 절대 경로를 생성합니다 .mp3. lame명령 에서 파일의 디렉토리 부분을 제거 하려면 $file로 변경 하십시오 ${file##*/}. 확장을 제거하려면 $file로 변경 하십시오 ${file%.*}. 두 가지를 모두 수행하려면 두 단계를 거쳐야합니다. 아래에서 디렉토리 계층을 재현 /media/1tb하려면을 사용할 수 있습니다 mkdir -p.

cd ~/test
inotifywait -m -r -q -e moved_to --format "%w%f" . |
while IFS= read -r file; do
  [ -f "$file" ] || continue; # skip directories and other special files
  dir=${file%/*}; file=${file##*/}
  mkdir -p "/media/1tb/$dir"
  flac -cd "$dir/$file" - | lame -b 320 - "/media/1tb/$dir/${file#.*}.mp3"
done

3

당신은 다음과 같은 것을 시도 할 수 있습니다 :

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test \
    | while read x; do \
        flac -cd "$x" - | lame -b 320 - "/media/1tb/$x.mp3"
    done;

1
while read …솔루션이지만 드롭 xargs. 당신이 쓴 것은 이해가되지 않습니다 : 당신은 어디에서 xargs입력을 받고 있다고 생각 합니까? 그리고 당신은 물건을 올바르게 인용해야하며, 음악 파일 이름에 공백이 포함되는 것이 일반적입니다.
Gilles 'SO- 악마 그만해

@Gilles OP가 무엇을하고 있는지 정확히 알지 못했거나 확실하지 않았으므로 "당신은 " 같은 것을 시도 할 수 있습니다. " 최선의 대답이 아니라 올바른 방향의 힌트라고 생각합니다. 인용 문제를 해결하고 xargs를 제거했습니다.
goldilocks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.