태그 보관물: shell

shell

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

폴더로 이동 된 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를 바꾸거나 어떤 식 으로든 두 명령이 액세스 할 수있는 변수로 보내길 원합니다. 나는 명명 된 파이프와 그 재즈로 엉망을 시도했지만 두 명령 사이에 실제 데이터가 파이프되어 있다는 사실이 저를 방해합니다.



답변

올바르게 이해하면 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


답변

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

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;


답변