Bash için nispeten yeniyim ve yüzeyde oldukça basit görünen bir şey yapmaya çalışıyorum - tüm * .wma dosyalarını almak için bir dizin hiyerarşisi üzerinde çalışın, onları mp3'e dönüştürdüğüm bir komuta boru ve dönüştürülen dosyayı .mp3 kaydedin. Benim düşüncem, komutun aşağıdaki gibi görünmesi gerektiğiydi (Ses dönüştürme komutunu bıraktım ve bunun yerine illüstrasyon için yankı kullanıyorum):
$ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3
Anladığım kadarıyla, -print0 arg alanı olan dosya adlarını (bunların çoğunun müzik dosyası olduğu gibi) kullanmama izin verecek. Daha sonra (xargs sonucunda) bulmak her dosya yolu f yakalanan ve alt dize kullanarak / dizenin sonundan silmek silmek, ben bir mp3 ile orijinal dosya yolunu yankılanmasını bekliyorum wma yerine uzantı. Ancak, bu sonuç yerine, aşağıdakileri görüyorum:
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
...
Yani sorum (belirli 'burada neyi yanlış yapıyorum' dışında), bu - bir boru işleminin sonucu olan değerlerin, dize manipülasyon işlemlerinde değişken bir atamanın sonucu olanlardan farklı şekilde ele alınması gerekir. ?
{}
üye)
xargs
daha uygun olan kenar durumlar vardır exec
. Bu vaka için stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs bu yığın dizisine bakın .
xargs
ilefind
. Bir-exec
seçenek ile geliyor . Sadece kullanacağınız komutu sorunuza ekleyebilir misiniz ve birisi size doğrufind
komutu gösterebilir mi ?