انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: Fire.Phoenix در 19 دی 1394، 02:00 ق‌ظ

عنوان: مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: Fire.Phoenix در 19 دی 1394، 02:00 ق‌ظ
بش اسکریپتی دارم که یک سری تغییرات را برروی فایل های تصویری با فرمت خاص در یک پوشه اعمال میکند
مشکل اینجاست که هر فایل تصویری در یک subfolder قرار دارد.
چگونه باید کاری کرد که با یک دستور اسکریپت bash به صورت اوتوماتیک در هر subfolder اجرا شود
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: M!lad در 19 دی 1394، 04:06 ق‌ظ
اینطور که می‌فرمایید، عملا وقتی اسکریپت شما اجرا میشه محلی که خودش در اون قرار داره رو به دست میاره، سپس فایل‌های تصویری اون شاخه رو لیست می‌کنه و تغییرات لازم رو اعمال می‌کنه. شما باید خود اسکریپتتون رو تفییر بدید، مثلا ببینید چطور داره لیست فایل‌ها رو بدست میاره و بهش سویچی اضافه کنید که زیرشاخه‌ها رو هم چک کنه.
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: بابک طور در 19 دی 1394، 08:41 ق‌ظ
سلام.
فکر کنم اگر اسکریپت رو قرار بدین، دوستان بیشتر بتونن کمکتون کنن.
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: Fire.Phoenix در 19 دی 1394، 08:40 ب‌ظ
#!/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 قرار دهم
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: M!lad در 19 دی 1394، 11:32 ب‌ظ
به جای ls|grep .mkv >1 بزارید find . -iname '*.mkv' >1 بقیه  فایلهای زیرشاخه ها رو هم لیست میکنه.
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: بابک طور در 19 دی 1394، 11:33 ب‌ظ
خوب توی خط سوم فایل‌هات رو انتخاب می‌کنی. پس همونجا هم باید مانور بدی...

باید یک سوییچی، چیزی برای ls پیدا کنی. من توی راهنمای فرمان ls خوندم که اگه از سوییچ R- رو استفاده کنی به صورت بازگشتی زیر شاخه‌ها رو هم لیست می‌کنه. پس خط سوم احتمالاً به این شکل باید باشه:

ls -R|grep .mkv >1
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: M!lad در 19 دی 1394، 11:34 ب‌ظ
خوب توی خط سوم فایل‌هات رو انتخاب می‌کنی. پس همونجا هم باید مانور بدی...

باید یک سوییچی، چیزی برای ls پیدا کنی. من توی راهنمای فرمان ls خوندم که اگه از سوییچ R- رو استفاده کنی به صورت بازگشتی زیر شاخه‌ها رو هم لیست می‌کنه. پس خط سوم احتمالاً به این شکل باید باشه:

ls -R|grep .mkv >1

اگر از سویچ R استفاده کنند اسم تمام فایل ها رو به صورت بازگشتی بر میگردونه در نتیجه نمیتونند توی اسکریپت ازش استفاده کنند.
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: امیــــــر در 19 دی 1394، 11:43 ب‌ظ
ls -R آدرس رو برنمی‌گردونه :)
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: بابک طور در 19 دی 1394، 11:45 ب‌ظ
یعنی فقط اسم فایل رو لیست می‌کنه؟ بدون آدرس؟
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: امیــــــر در 20 دی 1394، 12:14 ق‌ظ
تا جایی که من میدونم آره :)
البته ممکنه سوئیچ اضافی داشته باشه تا حالا ازش استفاده نکردم
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: Fire.Phoenix در 20 دی 1394، 01:41 ق‌ظ
مشکل اینجاست اگر اسم هر فایل را به عنوان متغییر 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 وجود داشته باشد به واسطه خط آخر حدف می شود در حالی که فقط نیاز به حذف فایل های تولید شده در خط ۵ هستیم
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: 藤沼 در 20 دی 1394، 03:25 ق‌ظ
از اسکریپت زیر می‌تونید به‌راحتی در هر مسیری که هستید، استفاده کنید (:
#!/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

عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: احسان فعالپور در 20 دی 1394، 01:35 ب‌ظ
واسه قسمتی که سعی کردید با 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  میچسبونه و یه . اضافه میاد.
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: 藤沼 در 20 دی 1394، 07:00 ب‌ظ
دقیقاً چرا سعی دارید تا جایی که ممکنه تنها از ‌یک دستور و گزینه‌های اون استفاده کنید؟!

نقل‌قول از: Doug McIlroy
.Write programs that do one thing and do it well
عنوان: پاسخ : مشکل در اجرای اسکریپت در هر پوشه
ارسال شده توسط: 藤沼 در 20 دی 1394، 07:04 ب‌ظ
حذف شود.