나는 Bash에 비교적 익숙하지 않고 표면에서 매우 간단하게 보이는 것을 시도하고있다. 디렉토리 계층 구조를 찾아 모든 * .wma 파일을 가져 와서 파이프로 출력하는 명령을 mp3로 변환하고 변환 된 파일을 .mp3로 저장하십시오. 내 생각은 명령이 다음과 같아야한다는 것입니다 (오디오 변환 명령을 중단하고 대신 에코를 사용하여 설명합니다).
$ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3
내가 이해했듯이 -print0 arg를 사용하면 공백이있는 파일 이름을 처리 할 수 있습니다 (많은 음악 파일이기 때문에). 그런 다음 (xargs의 결과로) find의 각 파일 경로가 f로 캡처되고 문자열 끝에서 하위 문자열 일치 / 삭제를 사용하여 원래 파일 경로를 mp3로 에코해야한다고 기대합니다. wma 대신 확장. 그러나이 결과 대신 다음과 같은 결과가 나타납니다.
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
...
따라서 내 질문 (특정 '여기서 내가 잘못하고있는 것'은 제외하고) 파이프 작업의 결과 값은 변수 할당의 결과와 문자열 조작 작업에서 다르게 처리되어야합니다. ?
{}
멤버) 의 각 결과에 대해 문자열 조작을 수행 할 수있는 한, 예 (아래에 언급 한대로 )
xargs
보다 적합한 경우가 exec
있습니다. 사례에 대해서는이 스택 포스트 stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs 를 참조하십시오 .
xargs
와 함께 사용할 이유가 없습니다find
.-exec
옵션 이 제공됩니다 . 질문에 사용할 명령을 추가하고 누군가에게 올바른find
명령을 보여줄 수 있습니까?