Chuyển đổi tất cả các tệp .ape thành .flac trong các thư mục con khác nhau


9

Tôi đã cố gắng chuyển đổi một số tệp .ape thành các tệp .flac bằng avconvdòng lệnh; rõ ràng, avconvkhông phải là điểm chính ở đây; cú pháp của nó khá đơn giản , avconv -i inputApeFile.ape outputFlacFile.flac.

Vấn đề là các tệp được lồng trong nhiều thư mục con hơn; tức là tôi có thư mục Artist, sau đó là các thư mục con CD khác nhau, mỗi thư mục chứa các tệp .ape khác nhau. Làm cách nào tôi có thể chuyển đổi tất cả các tệp và sau đó lưu chúng trong cùng một thư mục của tệp gốc nhưng với phần mở rộng .flac?

Nếu có thể, tôi chỉ muốn sử dụng lệnh shell trên một dòng mà không sử dụng tập lệnh. Tôi nghĩ nó nên như thế

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

nhưng tôi bị mắc kẹt với phần thứ hai (có thể sử dụng sed??!?)

Câu trả lời:


13

Lệnh mà bạn cần là:

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

Điều này sẽ tìm thấy mỗi tệp có .apehậu tố và sau đó chuyển đổi nó với cùng tên tệp có .flachậu tố đến cùng vị trí với tệp gốc được đặt.

{}là đường dẫn của tập tin tìm thấy hiện tại.
Xem bài kiểm tra từ đây


1

Kịch bản (python) dưới đây sẽ thực hiện công việc. Sao chép nó vào một tệp trống, lưu nó dưới dạng convert.py, đặt thư mục thành các tệp trong phần đầu của tập lệnh ( convert_dir =) và chạy nó bằng lệnh:

python3 /path/to/convert.py

Kịch bản

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

cảm ơn bạn đã trả lời và thời gian của bạn Jacob. Tuy nhiên, nếu có thể, tôi chỉ muốn sử dụng lệnh shell trên một dòng duy nhất mà không sử dụng tập lệnh (xin lỗi vì điều đó, tôi phải chỉ định điều này trước đây)
tigerjack89

1
@ tigerjack89 Chà, có lẽ ai đó els có thể sử dụng nó trong các tình huống tương tự; cú pháp <lệnh> <inputfile> <outputfile> khá phổ biến.
Jacob Vlijm

0

Bây giờ ffmpeg được ưa thích hơn avconv một lần nữa, và có nhiều máy tính lõi giá rẻ ($ 60 cho XU4 8 lõi) Tôi sử dụng các cách sau để có hiệu quả nhất;

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

một dòng lệnh bạn đang tìm kiếm:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findlệnh sẽ chỉ cung cấp tập tin kết thúc với .ape
các findlệnh sẽ cung cấp cho các đường dẫn tương đối để avconvchỉ huy để nó có thể chuyển đổi các tập tin và giữ chúng trong cùng thư mục với file đầu vào (tức là .ape).
findlệnh sẽ tìm tất cả các tệp trong thư mục đó bất kể chúng được giữ sâu đến mức nào trong thư mục con


2
Điều này sẽ không hoạt động; avconvkhông thể lấy các tập tin đầu vào từ STDIN như thế.
evilsoup

1
Còn thư mục đầu ra thì sao?
tigerjack89

@evilsoup Tôi đã cập nhật câu trả lời, xargs có thể giải quyết vấn đề. hãy thử cái này
Edward Torvalds
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.