Tüm .ape dosyalarını farklı alt klasörlerde .flac dosyasına dönüştürün


9

avconvKomut satırında kullanarak bazı .ape dosyalarını .flac dosyalarına dönüştürmeye çalışıyordum ; açıkçası, avconvburada ana nokta değil; sözdizimi oldukça basittir avconv -i inputApeFile.ape outputFlacFile.flac.

Mesele şu ki, dosyalar daha fazla alt klasör içine yerleştirilmiş; Yani, Artist klasörü, sonra çeşitli CD alt klasörleri var, her biri farklı .ape dosyaları içeriyor. Tüm dosyaları nasıl dönüştürebilir ve sonra orijinal dosyanın aynı klasörüne ancak .flac uzantısıyla kaydedebilirim?

Mümkünse, komut dosyaları kullanmadan tek bir satırda yalnızca kabuk komutunu kullanmak istiyorum. Bence böyle bir şey olmalı

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

ama ikinci kısımda takılıp kaldım (belki sed??!? kullanarak )

Yanıtlar:


13

İhtiyacınız olan komut:

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

Bu, .apesonek içeren her dosyayı bulur ve ardından sonekle aynı dosya .flacadıyla orijinal dosyanın bulunduğu konuma dönüştürür.

{}mevcut bulunan dosyanın yoludur.
Testi buradan görün


1

Aşağıdaki (python) komut dosyası işi yapmalıdır. Boş bir dosyaya kopyalayın, kaydedin convert.py, dizini komut dosyasının ( convert_dir =) baş kısmındaki dosyalara ayarlayın ve komutla çalıştırın:

python3 /path/to/convert.py

Senaryo

#!/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

Cevabınız ve zamanınız için teşekkürler Jacob. Ancak, mümkünse, komut dosyası kullanmadan tek bir satırda sadece kabuk komutunu kullanmak istiyorum (bunun için üzgünüm, bunu daha önce belirtmek zorunda kaldım)
tigerjack89

1
@ tigerjack89 Belki de birileri bunu benzer durumlarda kullanabilir; <komut> <inputfile> <outputfile> sözdizimi oldukça yaygındır.
Jacob Vlijm

0

Şimdi ffmpeg tekrar avconv'a göre tercih ediliyor ve ucuz birçok çekirdek bilgisayar var (8 çekirdekli XU4 için 60 $) En etkili olmak için aşağıdakileri yapıyorum;

#!/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 "$@"' _ "{}"

-1

aradığınız bir satır komutu:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findkomut yalnızca .ape ile biten dosyaları sağlar
. findKomut , komutun göreli yolunu verir, avconvböylece bu dosyaları dönüştürebilir ve bunları giriş dosyasıyla aynı klasörde tutabilir (yani .ape).
findkomutu, alt dizinde ne kadar derin tutulduklarına bakılmaksızın bu dizindeki tüm dosyaları bulur


2
Bu işe yaramaz; avconvSTDIN'den girdi dosyaları bu şekilde alınamıyor.
evilsoup

1
çıktı klasörü ne olacak?
tigerjack89

@evilsoup Cevabı güncelledim, xargs sorunu çözebilir. lütfen bunu deneyin.
Edward Torvalds
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.