Sono relativamente nuovo in Bash e sto provando a fare qualcosa che in apparenza sembra piuttosto semplice: esegui trova su una gerarchia di directory per ottenere tutti i file * .wma, esegui l'output in un comando in cui li converto in mp3 e salva il file convertito come .mp3. Pensavo che il comando dovesse apparire come il seguente (ho lasciato fuori il comando di conversione audio e sto usando invece echo per l'illustrazione):
$ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3
A quanto ho capito, l'argomento -print0 mi permetterà di gestire i nomi di file che hanno spazi (cosa che molti di questi fanno come file musicali). Mi aspetto quindi (come risultato di xargs) che ogni percorso del file da find sia catturato in f, e che usando la sottostringa match / delete dalla fine della stringa, che dovrei fare eco al percorso del file originale con un mp3 estensione invece di wma. Tuttavia, invece di questo risultato, sto vedendo quanto segue:
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
...
Quindi la mia domanda (a parte lo specifico 'cosa sto facendo di sbagliato qui'), è questa: i valori che sono il risultato di un'operazione di pipe devono essere trattati in modo diverso nelle operazioni di manipolazione di stringhe rispetto a quelli che sono il risultato di un'assegnazione variabile ?
{}
membro)
xargs
è più adatto di exec
. Vedere questo stackpost stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs per un caso emblematico.
xargs
confind
. Viene fornito con-exec
un'opzione. Puoi semplicemente aggiungere il comando che intendi utilizzare alla tua domanda e qualcuno può mostrarti ilfind
comando corretto ?