แปลงไฟล์. ไฟล์ทั้งหมดเป็น. flac ในโฟลเดอร์ย่อยต่างๆ


9

ฉันพยายามแปลง. ไฟล์บางไฟล์เป็น. flac โดยใช้avconvบรรทัดคำสั่ง เห็นได้ชัดว่าavconvไม่ใช่ประเด็นหลักที่นี่ avconv -i inputApeFile.ape outputFlacFile.flacไวยากรณ์ที่จะตรงไปตรงสวย

ประเด็นก็คือไฟล์จะซ้อนในโฟลเดอร์ย่อยมากกว่า เช่นฉันมีโฟลเดอร์ศิลปินจากนั้นโฟลเดอร์ย่อยซีดีต่างๆแต่ละรายการมีไฟล์. ape ที่แตกต่างกัน ฉันจะแปลงไฟล์ทั้งหมดแล้วบันทึกในโฟลเดอร์เดียวกันของไฟล์ต้นฉบับ แต่ใช้นามสกุล. flac ได้อย่างไร

หากเป็นไปได้ฉันต้องการใช้คำสั่ง shell เพียงบรรทัดเดียวโดยไม่ต้องใช้สคริปต์ ฉันคิดว่ามันควรจะเป็นอย่างนั้น

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

สคริปต์ (python) ด้านล่างควรทำงาน คัดลอกลงในไฟล์เปล่าบันทึกเป็น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

ขอบคุณสำหรับคำตอบของคุณและเวลาของคุณจาค็อบ อย่างไรก็ตามหากเป็นไปได้ฉันต้องการใช้คำสั่ง shell เพียงบรรทัดเดียวโดยไม่ต้องใช้สคริปต์ (ขออภัยสำหรับสิ่งนั้นฉันต้องระบุสิ่งนี้มาก่อน)
tigerjack89

1
@ tigerjack89 เอาละบางคนอาจจะใช้มันในสถานการณ์ที่คล้ายกัน ไวยากรณ์ <command> <inputfile> <outputfile> เป็นเรื่องปกติ
Jacob Vlijm

0

ตอนนี้ ffmpeg เป็นที่ต้องการมากกว่า avconv อีกครั้งและมีคอมพิวเตอร์ core ราคาถูกจำนวนมาก ($ 60 สำหรับ 8 core XU4) ฉันใช้ fount ต่อไปนี้เพื่อให้มีประสิทธิภาพมากที่สุด

#!/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คำสั่งจะให้เฉพาะไฟล์ที่ลงท้ายด้วยลิง คำสั่งจะให้เส้นทางเทียบกับคำสั่งเพื่อที่จะสามารถแปลงไฟล์เหล่านั้นและเก็บไว้ในโฟลเดอร์เดียวกันกับแฟ้มใส่ (เช่นลิง) คำสั่งจะค้นหาไฟล์ทั้งหมดในไดเรกทอรีนั้นโดยไม่คำนึงว่าไฟล์เก็บไว้ลึกแค่ไหนในไดเรกทอรีย่อย
findavconv
find


2
สิ่งนี้จะไม่ทำงาน avconvไม่สามารถรับไฟล์อินพุตจาก STDIN ได้
evilsoup

1
โฟลเดอร์เอาท์พุทเป็นอย่างไร
tigerjack89

@evilsoup ฉันได้อัปเดตคำตอบแล้ว xargs สามารถแก้ปัญหาได้ โปรดลองสิ่งนี้
Edward Torvalds
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.