Jestem stosunkowo nowy w Bash i próbuję zrobić coś, co na pozór wydawało się dość proste - uruchom wyszukiwanie w hierarchii katalogów, aby uzyskać wszystkie pliki * .wma, potokuj dane wyjściowe do polecenia, w którym przekonwertuję je na mp3 i zapisz przekonwertowany plik jako .mp3. Myślałem, że polecenie powinno wyglądać następująco (zrezygnowałem z polecenia konwersji audio i zamiast tego używam echa do ilustracji):
$ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3
Jak rozumiem, argument -print0 pozwoli mi obsługiwać nazwy plików ze spacjami (co wiele z nich robi, ponieważ są plikami muzycznymi). Spodziewam się (w wyniku xargs), że każda ścieżka pliku znalezienia jest przechwytywana wf, i że używając podłańcucha dopasuj / usuń z końca łańcucha, powinienem powtórzyć oryginalną ścieżkę pliku z mp3 rozszerzenie zamiast wma. Jednak zamiast tego wyniku widzę:
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
...
Tak więc moje pytanie (oprócz konkretnego „co tutaj robię źle”) brzmi: czy wartości, które są wynikiem operacji potoku, muszą być traktowane inaczej w operacjach manipulacji ciągiem niż te, które są wynikiem przypisania zmiennej ?
{}
członka)
xargs
jest bardziej odpowiednie niż exec
. Zobacz przykład stosu stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs dla konkretnego przypadku.
xargs
zfind
. Pochodzi z-exec
opcją. Czy możesz po prostu dodać do pytania polecenie, którego zamierzasz użyć, a ktoś może pokazać prawidłowefind
polecenie?