सभी .af फ़ाइलों को अलग-अलग सबफ़ोल्डर्स में .flac में कनवर्ट करें


9

मैं कुछ .af फ़ाइलों को avconvकमांड लाइन पर उपयोग करके .flac फाइलों में बदलने की कोशिश कर रहा था ; जाहिर है, avconvयहां मुख्य बिंदु नहीं है; अपने वाक्यविन्यास सुंदर, सरल है avconv -i inputApeFile.ape outputFlacFile.flac

मुद्दा यह है कि फाइलें अधिक सबफ़ोल्डर में नेस्टेड हैं; यानी, मेरे पास आर्टिस्ट फ़ोल्डर है, फिर विभिन्न सीडी सबफोल्डर्स हैं, जिनमें से प्रत्येक में अलग-अलग .af फाइलें हैं। मैं सभी फ़ाइलों को कैसे बदल सकता हूं और फिर उन्हें मूल फ़ाइल के समान फ़ोल्डर में लेकिन .flac एक्सटेंशन के साथ सहेज सकता हूं?

यदि यह संभव है, तो मैं स्क्रिप्ट्स का उपयोग किए बिना केवल एक ही लाइन पर शेल कमांड का उपयोग करना चाहूंगा। मुझे लगता है कि यह कुछ ऐसा होना चाहिए

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

लेकिन मैं दूसरे भाग के साथ फंस गया हूँ (शायद का उपयोग कर sed??)?

जवाबों:


13

आपको जो कमांड चाहिए वह है:

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

इससे प्रत्येक फ़ाइल को .apeप्रत्यय मिलेगा और फिर इसे उसी फ़ाइल नाम के साथ .flacप्रत्यय के साथ उसी स्थान पर रूपांतरित करें जैसा कि मूल फ़ाइल स्थित है।

{}वर्तमान पाया फ़ाइल का पथ है।
परीक्षण यहाँ से देखें


1

नीचे (अजगर) स्क्रिप्ट को काम करना चाहिए। इसे एक खाली फ़ाइल में कॉपी करें, इसे इस रूप में सहेजें convert.py, निर्देशिका को स्क्रिप्ट के मुख्य भाग की फाइलों में सेट करें ( convert_dir =) और इसे कमांड पर चलाएँ:

python3 /path/to/convert.py

लिपी

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

आपके उत्तर और आपके समय के लिए धन्यवाद याकूब। हालांकि, अगर यह संभव है, तो मैं स्क्रिप्ट का उपयोग किए बिना एक लाइन पर केवल शेल कमांड का उपयोग करना चाहूंगा (इसके लिए खेद है, मुझे इसे पहले निर्दिष्ट करना था)
tigerjack89

1
@ tigerjack89 ठीक है, हो सकता है कि कोई व्यक्ति इसी तरह की स्थितियों में इसका इस्तेमाल कर सके; वाक्यविन्यास <कमांड> <inputfile> <outputfile> बहुत आम है।
याकूब Vlijm

0

अब उस ffmpeg को एवोकॉन पर फिर से पसंद किया गया है, और सस्ते कोर कंप्यूटर हैं (8 कोर XU4 के लिए $ 60) मैं सबसे प्रभावी होने के लिए निम्नलिखित फव्वारा करता हूं;

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

एक लाइन कमांड जिसे आप ढूंढ रहे थे:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findकमांड केवल .p
के साथ समाप्त होने वाली फाइलों को प्रदान करेगा । findकमांड कमांड के लिए सापेक्ष पथ देगा avconvताकि यह उन फाइलों को परिवर्तित कर सके और उन्हें इनपुट फाइल (यानी .ape) के समान फ़ोल्डर में रख सके।
findकमांड उस निर्देशिका में सभी फाइलों को खोजेगी चाहे वे कितनी भी गहरी हों, उन्हें उपनिर्देशिका में रखा जाता है


2
यह काम नहीं करेगा; avconvएसटीडीआईएन की तरह इनपुट फाइल नहीं ले सकते।
evilsoup

1
आउटपुट फ़ोल्डर के बारे में क्या?
tigerjack89

@evilsoup मैंने उत्तर को अपडेट कर दिया है, xargs समस्या को हल कर सकता है। कृपया यह प्रयास करें।
एडवर्ड टॉर्वाड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.