Saya perlu mengkonversi video, tetapi saya tidak tahu di mana mereka, jadi saya perlu find
mereka. Bagaimana saya bisa memberikan hasil dan nama file output ke FFmpeg dengan xargs
?
Saya sudah tahu bahwa saya dapat membangun dua parameter dengan perintah ini:
find . -iname "*.mov" -printf "%p %f\n"
Saya tidak dapat menemukan apa pun yang terkait dalam xargs
manual. Saya ingin sesuatu seperti ini:
find . -iname "*.mov" -printf "%p %f\n" | xargs ffmpeg -i {param1} -f flv {param2}
Bagaimana saya bisa melakukan ini?
command-line
bash
xargs
command-line-arguments
kissgyorgy
sumber
sumber
xargs
secara umum mungkin ingin memeriksa stackoverflow.com/questions/3770432/… .Jawaban:
Sesuatu seperti ini akan melakukan trik dan mempertahankan jalur penuh, menangani ruang, mengganti nama
folder/movie.mov
menjadifolder/movie.flv
, dll.Dan jika saya salah mengerti Anda dan Anda ingin semua film .flv di direktori saat ini, gunakan yang ini:
sumber
Alasan yang digunakan orang
xargs
dalam kombinasi dengan find adalah bahwa banyak nama file akan diteruskan ke permohonan program yang sama denganxargs
peluncuran program apa pun . Misalnya, jikafind
mengembalikan file foo , bar , dan baz , berikut ini akan berjalanmv
hanya sekali:Secara efektif, ini memanggil
mv
seperti berikut:Jika Anda tidak perlu atau ingin perilaku ini (seperti yang saya asumsikan adalah kasus di sini), Anda dapat menggunakan
find
's-exec
.Dalam hal ini, solusi mudahnya adalah dengan menulis skrip shell pendek, seperti berikut:
Simpan sebagai
myffmpeg.sh
dan jalankanchmod +x myffmpeg.sh
. Kemudian, jalankan yang berikut:Ini akan memanggil skrip shell sekali untuk setiap file yang ditemukan. Script shell pada gilirannya mengekstrak nama file dari path lengkap, dan memanggil
ffmpeg
dengan argumen yang sesuai.sumber
Saya tidak mendapatkan solusi yang saya harapkan, jadi saya menemukan solusi sendiri. @ Jawaban Daniel itu bagus, tetapi perlu skrip shell. Satu liner lebih cepat, dan saya menyukainya lebih baik :) juga solusi yang lebih sederhana daripada menulis skrip.
Saya bisa menggunakan satu argumen dan memprosesnya dengan
basename
dan menggunakansh -c
-I Memberitahu xargs untuk mengganti
{}
dengan argumen saat ini.Output perintah di dalam `` dicetak ke output standar (fitur bash) sehingga
basename {}
akan dievaluasi sebagai nama file kosong dan dicetak.-0 untuk menangani nama file khusus dengan benar, tetapi Anda harus memberikan parameter dengan opsi -print0 dengan find
sumber
Anda harus melakukannya seperti semua jawaban di sana, tetapi penggunaan xargs yang TEPAT akan menjadi seperti ini:
Jadi dalam kasus Anda itu adalah:
PS: Ini menjawab pertanyaan tentang xargs untuk mereka yang mencari jawaban tepat untuk beberapa
xargs
parameter dalam satuxargs
perintah.sumber
Mengapa tidak memindahkan opsi ffmpeg agar sesuai dengan format hasil dari perintah find ?
Perhatikan penambahan opsi -r ke xargs untuk mencegahnya menjalankan ffmpeg jika tidak ditemukan file .mov .
Saya telah menambahkan opsi -n2 ke xargs untuk membatasi jumlah item yang diproses xargs menjadi dua sekaligus. Dalam hal ini, item adalah path file dan nama file. Jika opsi no -n diatur, xargs akan memproses item input sebanyak mungkin dalam satu eksekusi.
sumber
Saya tidak yakin apakah Anda bisa atau bagaimana melakukannya dengan xargs.
Tetapi sesuatu seperti ini seharusnya bekerja untuk Anda:
sumber
Alternatif jawaban Zoredache menggunakan pengikatan nama (dan menggunakan pemisah yang berbeda untuk menghindari masalah spasi dalam nama file):
Tentu saja Anda juga dapat menggunakan pemisah dengan
find -a array
argumen yang digunakan oleh jawaban lain, tetapi terkadang argumen yang disebut lebih mudah dipahami.sumber
Anda dapat menjalankan ffmpeg langsung dari perintah find seperti ini:
Perhatikan tanda kutip di sekitar parameter ke ffmpeg, jika ada spasi dalam nama file, dan tanda titik dua yang lolos menandai akhir dari perintah yang dieksekusi.
sumber