انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: Fire.Phoenix در 19 دی 1394، 02:00 قظ
-
بش اسکریپتی دارم که یک سری تغییرات را برروی فایل های تصویری با فرمت خاص در یک پوشه اعمال میکند
مشکل اینجاست که هر فایل تصویری در یک subfolder قرار دارد.
چگونه باید کاری کرد که با یک دستور اسکریپت bash به صورت اوتوماتیک در هر subfolder اجرا شود
-
اینطور که میفرمایید، عملا وقتی اسکریپت شما اجرا میشه محلی که خودش در اون قرار داره رو به دست میاره، سپس فایلهای تصویری اون شاخه رو لیست میکنه و تغییرات لازم رو اعمال میکنه. شما باید خود اسکریپتتون رو تفییر بدید، مثلا ببینید چطور داره لیست فایلها رو بدست میاره و بهش سویچی اضافه کنید که زیرشاخهها رو هم چک کنه.
-
سلام.
فکر کنم اگر اسکریپت رو قرار بدین، دوستان بیشتر بتونن کمکتون کنن.
-
#!/bin/bash
#filename
ls|grep .mkv >1
fileinput=$(cat "1")
#extract audio
ffmpeg -i $fileinput -vn -acodec copy eng.aac
#convert
ffmpeg -i eng.aac -f flac eng.flac
#delet file dont need
rm eng.aac
rm 1
اگر برنامه ای که استفاده میکنم نتونه فایل را از مسیر خاصی صدا بزند باید چه کرد مثلا در این نمونه fileinput باید اسم فایل باشد و نمیتونم مسیر فایل را به جای fileinput قرار دهم
-
به جای ls|grep .mkv >1 بزارید find . -iname '*.mkv' >1 بقیه فایلهای زیرشاخه ها رو هم لیست میکنه.
-
خوب توی خط سوم فایلهات رو انتخاب میکنی. پس همونجا هم باید مانور بدی...
باید یک سوییچی، چیزی برای ls پیدا کنی. من توی راهنمای فرمان ls خوندم که اگه از سوییچ R- رو استفاده کنی به صورت بازگشتی زیر شاخهها رو هم لیست میکنه. پس خط سوم احتمالاً به این شکل باید باشه:
ls -R|grep .mkv >1
-
خوب توی خط سوم فایلهات رو انتخاب میکنی. پس همونجا هم باید مانور بدی...
باید یک سوییچی، چیزی برای ls پیدا کنی. من توی راهنمای فرمان ls خوندم که اگه از سوییچ R- رو استفاده کنی به صورت بازگشتی زیر شاخهها رو هم لیست میکنه. پس خط سوم احتمالاً به این شکل باید باشه:
ls -R|grep .mkv >1
اگر از سویچ R استفاده کنند اسم تمام فایل ها رو به صورت بازگشتی بر میگردونه در نتیجه نمیتونند توی اسکریپت ازش استفاده کنند.
-
ls -R آدرس رو برنمیگردونه :)
-
یعنی فقط اسم فایل رو لیست میکنه؟ بدون آدرس؟
-
تا جایی که من میدونم آره :)
البته ممکنه سوئیچ اضافی داشته باشه تا حالا ازش استفاده نکردم
-
مشکل اینجاست اگر اسم هر فایل را به عنوان متغییر fileinput بدم چون در مسیر محل اجرا اسکریپت قرار ندارد قادر به پیدا کردن و انجام بقیه مراحل نیست
برای پیدا کردن با آدرس میشه از این دستور استفاده کرد ولی چگونه باید از آن به عنوان fileinput استفاده کرد؟
find . -name '*.mkv' -printf "file '$PWD/%p'\n">>1
[/s]
مشکل را تا حدودی با این کد حل کردم اگرچه هنوز متوچه نشدم دقیقا چگونه کار می کند
#!/bin/bash
#filename
var=$(pwd)
echo $var
find $var -type f -name "*.mp4" -exec ffmpeg -i '{}' -vn -acodec copy '{}.aac' \;
#convert
find $var -type f -name "*.aac" -exec ffmpeg -i '{}' -f flac '{}.flac' \;
#delet file dont need
find $var -type f -name "*.aac" -exec rm '{}' \;
مشکل اینجاست که فایل های تولید شده به فرمت flac باید اسمشان eng باشد که در این حالت بخش آدرس از بین می رود و در نیتجه کل اسکریپت از کار می افتد
سوال دوم آنکه می توان کاری کرد که فایل اصلی و تبدیل شده را مشخص کرد در این حالت چون از دستور find استفاده شده است اگر در یکی از پوشه ها از قبل فایلی به فرمت aac وجود داشته باشد به واسطه خط آخر حدف می شود در حالی که فقط نیاز به حذف فایل های تولید شده در خط ۵ هستیم
-
از اسکریپت زیر میتونید بهراحتی در هر مسیری که هستید، استفاده کنید (:
#!/usr/bin/env bash
copy_audio_stream() {
ffmpeg -i "$1" -vn -acodec copy "${1%.*}".aac < /dev/null
}
find . iname "$1" | while read -r filename; do
if [[ ! "$filename" = . ]]; then
copy_audio_stream "$filename"
fi
done
-
واسه قسمتی که سعی کردید با find مسیر فایل رو بدست بیارید استفاده از printf اشتباهه.
استفاده از روش شما:
[0:ehsan@manjaro:13:30:21:Episode13]$
>>>find . -name '*.mkv' -printf "file '$PWD/%p'\n"
file '/run/media/ehsan/MultiMedia/MultiMedia/Film/Serial/Scorpion/S01/Episode13/./Scorpion.S01E13.480p.mkv'
روش دوم:
[0:ehsan@manjaro:13:32:26:Episode13]$
>>>find . -name '*.mkv' | xargs -I ITEM realpath ITEM
/run/media/ehsan/MultiMedia/MultiMedia/Film/Serial/Scorpion/S01/Episode13/Scorpion.S01E13.480p.mkv
[0:ehsan@manjaro:13:32:44:Episode13]$
میبینید که روش اول مسیر نسبی رو به انتهای pwd میچسبونه و یه . اضافه میاد.
-
دقیقاً چرا سعی دارید تا جایی که ممکنه تنها از یک دستور و گزینههای اون استفاده کنید؟!
.Write programs that do one thing and do it well
-
حذف شود.