내 파이프라인이 작동하지 않는 이유는 무엇입니까?

내 파이프라인이 작동하지 않는 이유는 무엇입니까?

내 다운로드 폴더에 있는 모든 mp3를 찾아서 음악 폴더로 옮기는 bash 스크립트를 만들려고 합니다. 이 줄은 왜 작동하지 않습니까?

find ./ -type f -name \*.mp3 | mv *.mp3 /home/mitch/Desktop/Music/$ARTIST

첫 번째 명령의 정보를 두 번째 명령으로 변환하기 위해 파이프라인을 사용해 보았지만 이전에는 파이프라인을 사용한 적이 없으며 내가 잘못하고 있는지 또는 파이프라인이 사용되는 것에 대해 잘못된 생각을 가지고 있는지 알 수 없습니다. 을 위한.

답변1

mv명령은 표준 입력을 사용하지 않으므로 표준 입력을 매개 변수로 변환해야 하며 이를 위해 다음을 사용할 수 있습니다 xargs.

find ./ -type f -name '*.mp3' | xargs mv -t /home/mitch/Desktop/Music/$ARTIST

또한 -exec다음 작업을 직접 사용할 수도 있습니다 find.

find ./ -type f -name '*.mp3' -exec mv {} /home/mitch/Desktop/Music/$ARTIST ';'

편집하다

@geirha가 지적한 것처럼 파일 이름에 공백이 포함되어 있으면 첫 번째 명령이 작동하지 않습니다. 그러한 경우에는 다음과 같아야 합니다

find ./ -type f -name '*.mp3' -print0 | xargs -0 mv -t /home/mitch/Desktop/Music/$ARTIST

답변2

xargs의 장점은 명령줄 확장입니다. 매우 많은 양의 텍스트(또는 하나의 명령으로 많은 파일)를 반환하는 명령이 있는 경우 xargs가 필요합니다.

디렉토리에 수천 개의 파일이 있고 해당 목록에서 일부 스크립트를 실행하려는 경우 " ./myprogram *"를 시도할 수 있지만 프로그램에 매개변수 크기에 제한이 있는 경우 *를 확장하여 버퍼를 날려버릴 수 있습니다. 또한 명령줄 자체에는 제한이 있으므로 명령줄 버퍼 오버런으로 인해 명령이 실패할 수 있습니다. xargs를 사용하면 문제를 피할 수 있습니다.

마지막으로 find의 -print0은 반환된 파일 이름의 공백에 대해 null 구분 기호를 넣고 xargs의 -0 옵션은 해당 null을 해석합니다. 읽다 man xargs.

관련 정보