Konversikan semua file .ape ke .flac di berbagai subfolder

9

Saya mencoba untuk mengkonversi beberapa file .ape ke file .flac menggunakan avconvpada baris perintah; jelas, avconvbukan poin utama di sini; sintaksnya cukup mudah avconv -i inputApeFile.ape outputFlacFile.flac,.

Intinya adalah bahwa file-file tersebut bersarang di lebih banyak subfolder; yaitu, saya memiliki folder Artis, kemudian berbagai subfolder CD, masing-masing berisi file .ape yang berbeda. Bagaimana saya bisa mengonversi semua file dan kemudian menyimpannya di folder yang sama dengan file asli tetapi dengan ekstensi .flac?

Jika memungkinkan, saya hanya ingin menggunakan perintah shell pada satu baris tanpa menggunakan skrip. Saya pikir itu harus seperti itu

avconv -i 'ls -R | grep ape' '???'

tapi saya terjebak dengan bagian kedua (mungkin menggunakan sed??!?)

tigerjack89
sumber

Jawaban:

13

Perintah yang Anda butuhkan adalah:

find /path/to/MainDir/ -type f -name "*.ape"  -execdir sh -c ' avconv -i "$1" "${1%.ape}.flac" ' _ {} \;

Ini akan menemukan setiap file yang memiliki .apesufiks dan kemudian mengonversinya dengan nama file yang sama dengan .flacsufiks ke lokasi yang sama dengan file asli berada.

{}adalah jalur dari file yang ditemukan saat ini.
Lihat tesnya dari sini

αғsнιη
sumber
1

Skrip (python) di bawah ini harus melakukan pekerjaan. Salin ke file kosong, simpan sebagai convert.py, atur direktori ke file di bagian kepala skrip ( convert_dir =) dan jalankan dengan perintah:

python3 /path/to/convert.py

Naskah

#!/usr/bin/env python3

convert_dir = "/path/to/folder/tobeconverted"

import os
import subprocess

for root, dirs, files in os.walk(convert_dir):
    for name in files:
        if name.endswith(".ape"):
            # filepath+name
            file = root+"/"+name
            # to use in other (convert) commands: replace the "avconv -i" by your command, and;
            # replace (".ape", ".flac") by the input / output extensions of your conversion
            command = "avconv -i"+" "+file+" "+file.replace(".ape", ".flac")
            subprocess.Popen(["/bin/bash", "-c", command])
        else:
            pass
Yakub Vlijm
sumber
terima kasih atas balasan dan waktu Anda Jacob. Namun, jika memungkinkan, saya hanya ingin menggunakan perintah shell pada satu baris tanpa menggunakan skrip (maaf untuk itu, saya harus menentukan ini sebelumnya)
tigerjack89
1
@ tigerjack89 Yah, mungkin seseorang lain bisa menggunakannya dalam situasi yang sama; sintaks <perintah> <inputfile> <outputfile> sangat umum.
Jacob Vlijm
0

Sekarang ffmpeg lebih disukai daripada avconv lagi, dan ada banyak komputer inti yang murah ($ 60 untuk 8 core XU4) Saya menemukan yang berikut ini yang paling efektif;

#!/bin/bash

#
# ape2flac.sh
#

function f2m(){
        FILE=$(echo "$1" | perl -p -e 's/.ape$//g');
        if [ ! -f "$FILE".flac ] ; then
                ffmpeg -v quiet -i "$FILE.ape" "$FILE.flac"
        fi
}
export -f f2m
find "$FOLDER" -name '*.ape' | xargs -I {} -P $(nproc) bash -c 'f2m "$@"' _ "{}"
pengguna1133275
sumber
-1

satu baris perintah yang Anda cari:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findperintah akan memberikan hanya file yang berakhir dengan .ape
yang findperintah akan memberikan path relatif ke avconvperintah sehingga dapat mengkonversi file tersebut dan simpan di folder yang sama dengan file input (yaitu .ape).
findperintah akan menemukan semua file di direktori itu terlepas dari seberapa dalam mereka disimpan dalam subdirektori

Edward Torvalds
sumber
2
Ini tidak akan berhasil; avconvtidak dapat mengambil file input dari STDIN seperti itu.
evilsoup
1
bagaimana dengan folder output?
tigerjack89
@ evilsoup Saya telah memperbarui jawabannya, xargs dapat menyelesaikan masalah ini. tolong coba ini.
Edward Torvalds