Sudah lama sejak saya menggunakannya make
, jadi bersabarlah ...
Saya punya direktori flac
, berisi file .FLAC. Saya punya direktori yang sesuai, mp3
berisi file MP3. Jika file FLAC lebih baru dari file MP3 yang sesuai (atau file MP3 yang sesuai tidak ada), maka saya ingin menjalankan banyak perintah untuk mengonversi file FLAC ke file MP3, dan menyalin tag.
Penendang: Saya perlu mencari flac
direktori secara rekursif, dan membuat subdirektori yang sesuai di mp3
direktori. Direktori dan file dapat memiliki spasi pada namanya, dan diberi nama dalam UTF-8.
Dan saya ingin menggunakan make
untuk mengendarai ini.
make
lebih mendekati penerapannya daripada telanjangbash
.sh
skrip yang menelusuri daftar file flac (find | while read flacname
), membuat amp3name
dari itu, menjalankan "mkdir -p" padadirname "$mp3name"
, dan kemudian,if [ "$flacfile" -nt "$mp3file"]
mengubahnya"$flacname"
menjadi"$mp3name"
tidak benar-benar ajaib. Satu-satunya fitur yang benar-benar hilang dibandingkan denganmake
solusi berbasis adalah kemungkinan untuk menjalankanN
proses konversi file secara paralelmake -jN
.make
dan memiliki spasi pada nama file adalah persyaratan yang kontradiktif. Gunakan alat yang sesuai untuk domain masalah.Jawaban:
Saya akan mencoba sesuatu seperti ini
Beberapa catatan singkat untuk
make
pemula:@
depan perintah mencegahmake
pencetakan perintah sebelum benar-benar menjalankannya.$(@D)
adalah bagian direktori dari nama file target ($@
)Bahkan jika ini harus menangani semua karakter dan item UTF-8, itu akan gagal pada spasi dalam nama file atau direktori, karena
make
menggunakan spasi untuk memisahkan hal-hal dalam makefile dan saya tidak mengetahui cara untuk mengatasinya. Sehingga Anda hanya memiliki skrip shell, saya khawatir: - /sumber
vpath
. Harus mempelajarinya suatu hari nanti.find
untuk mendapatkan nama secara rekursif ...make -jN
. UntukN
menggunakan jumlah konversi yangmake
harus dijalankan secara paralel. Perhatian: Berjalanmake -j
tanpaN
akan memulai semua proses konversi sekaligus secara paralel yang mungkin setara dengan bom garpu..PHONY: all
Baris memberitahu make bahwa resep untukall
target akan dieksekusi meskipun ada file bernamaall
lebih baru dari semua$(MP3_FILES)
.Anda dapat menentukan fungsi wildcard rekursif Anda sendiri seperti ini:
Parameter pertama (
$1
) adalah daftar direktori, dan yang kedua ($2
) adalah daftar pola yang ingin Anda cocokkan.Contoh:
Untuk menemukan semua file C di direktori saat ini:
Untuk menemukan semua
.c
dan.h
file disrc
:Fungsi ini didasarkan pada implementasi dari artikel ini , dengan beberapa perbaikan.
sumber
make
Turing Tar Pit (lihat di sini: yosefk.com/blog/fun-at-the-turing-tar-pit.html ). Ini bahkan tidak terlalu sulit, tetapi kita harus membaca ini: gnu.org/software/make/manual/html_node/Call-Function.html dan kemudian "memahami kekambuhan". ANDA harus menulis ini secara rekursif, dalam arti kata demi kata; ini bukan pemahaman sehari-hari tentang "secara otomatis menyertakan barang dari subdir". Ini RECURRENCE sebenarnya. Tapi ingat - "Untuk memahami kekambuhan, Anda harus memahami kekambuhan".FWIW, saya telah menggunakan sesuatu seperti ini di Makefile :
Contoh di atas akan mencari dari direktori saat ini ( '.' ) Untuk semua "file biasa" ( '-type f' ) dan menyetel
RECURSIVE_MANIFEST
variabel make ke setiap file yang ditemukannya. Anda kemudian dapat menggunakan substitusi pola untuk mengurangi daftar ini, atau sebagai alternatif, berikan lebih banyak argumen ke dalam find untuk mempersempit apa yang dikembalikannya. Lihat halaman manual untuk menemukan .sumber
Solusi saya didasarkan pada yang di atas, menggunakan
sed
alih-alihpatsubst
mengacaukan output darifind
DAN melarikan diri dari ruang.Beralih dari flac / ke ogg /
Peringatan:
sumber
Berikut ini skrip Python yang saya retas dengan cepat untuk menyelesaikan masalah asli: simpan salinan pustaka musik yang dikompresi. Skrip akan mengubah file .m4a (diasumsikan ALAC) ke format AAC, kecuali file AAC sudah ada dan lebih baru dari file ALAC. File MP3 di perpustakaan akan ditautkan, karena sudah dikompresi.
Berhati-hatilah karena membatalkan skrip ( ctrl-c) akan meninggalkan file yang setengah dikonversi.
Saya awalnya juga ingin menulis Makefile untuk menangani ini, tetapi karena Makefile tidak dapat menangani spasi dalam nama file (lihat jawaban yang diterima) dan karena menulis skrip bash dijamin akan menempatkan saya di dunia yang menyakitkan, Python itu. Ini cukup mudah dan singkat, dan karenanya harus mudah disesuaikan dengan kebutuhan Anda.
Tentu saja, ini dapat ditingkatkan untuk melakukan pengkodean secara paralel. Itu dibiarkan sebagai latihan bagi pembaca ;-)
sumber
Jika Anda menggunakan Bash 4.x, Anda dapat menggunakan opsi globbing baru , misalnya:
Wildcard rekursif semacam ini dapat menemukan semua file yang Anda minati ( .flac , .mp3 atau apa pun). HAI
sumber
**
tidak akan berfungsi, karena globbing yang diperluas adalah hal bash / zsh.