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

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


ارائه ۲۴٫۱۰ اوبونتو منتشر شد 🎉

نویسنده موضوع: مشکل در اجرای اسکریپت در هر پوشه  (دفعات بازدید: 2683 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین Fire.Phoenix

  • Full Member
  • *
  • ارسال: 108
مشکل در اجرای اسکریپت در هر پوشه
« : 19 دی 1394، 02:00 ق‌ظ »
بش اسکریپتی دارم که یک سری تغییرات را برروی فایل های تصویری با فرمت خاص در یک پوشه اعمال میکند
مشکل اینجاست که هر فایل تصویری در یک subfolder قرار دارد.
چگونه باید کاری کرد که با یک دستور اسکریپت bash به صورت اوتوماتیک در هر subfolder اجرا شود

آفلاین M!lad

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1757
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #1 : 19 دی 1394، 04:06 ق‌ظ »
اینطور که می‌فرمایید، عملا وقتی اسکریپت شما اجرا میشه محلی که خودش در اون قرار داره رو به دست میاره، سپس فایل‌های تصویری اون شاخه رو لیست می‌کنه و تغییرات لازم رو اعمال می‌کنه. شما باید خود اسکریپتتون رو تفییر بدید، مثلا ببینید چطور داره لیست فایل‌ها رو بدست میاره و بهش سویچی اضافه کنید که زیرشاخه‌ها رو هم چک کنه.
..I feel no fault for the fault I feel..

آفلاین بابک طور

  • Hero Member
  • *
  • ارسال: 800
  • جنسیت : پسر
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #2 : 19 دی 1394، 08:41 ق‌ظ »
سلام.
فکر کنم اگر اسکریپت رو قرار بدین، دوستان بیشتر بتونن کمکتون کنن.

آفلاین Fire.Phoenix

  • Full Member
  • *
  • ارسال: 108
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #3 : 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 قرار دهم
« آخرین ویرایش: 19 دی 1394، 11:19 ب‌ظ توسط Fire.Phoenix »

آفلاین M!lad

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1757
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #4 : 19 دی 1394، 11:32 ب‌ظ »
به جای ls|grep .mkv >1 بزارید find . -iname '*.mkv' >1 بقیه  فایلهای زیرشاخه ها رو هم لیست میکنه.
..I feel no fault for the fault I feel..

آفلاین بابک طور

  • Hero Member
  • *
  • ارسال: 800
  • جنسیت : پسر
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #5 : 19 دی 1394، 11:33 ب‌ظ »
خوب توی خط سوم فایل‌هات رو انتخاب می‌کنی. پس همونجا هم باید مانور بدی...

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

ls -R|grep .mkv >1

آفلاین M!lad

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1757
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #6 : 19 دی 1394، 11:34 ب‌ظ »
خوب توی خط سوم فایل‌هات رو انتخاب می‌کنی. پس همونجا هم باید مانور بدی...

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

ls -R|grep .mkv >1

اگر از سویچ R استفاده کنند اسم تمام فایل ها رو به صورت بازگشتی بر میگردونه در نتیجه نمیتونند توی اسکریپت ازش استفاده کنند.
..I feel no fault for the fault I feel..

آفلاین امیــــــر

  • High Sr. Member
  • *
  • ارسال: 617
  • جنسیت : پسر
  • نرم‌افزار مال منه، نه من مال اون
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #7 : 19 دی 1394، 11:43 ب‌ظ »
ls -R آدرس رو برنمی‌گردونه :)

آفلاین بابک طور

  • Hero Member
  • *
  • ارسال: 800
  • جنسیت : پسر
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #8 : 19 دی 1394، 11:45 ب‌ظ »
یعنی فقط اسم فایل رو لیست می‌کنه؟ بدون آدرس؟

آفلاین امیــــــر

  • High Sr. Member
  • *
  • ارسال: 617
  • جنسیت : پسر
  • نرم‌افزار مال منه، نه من مال اون
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #9 : 20 دی 1394، 12:14 ق‌ظ »
تا جایی که من میدونم آره :)
البته ممکنه سوئیچ اضافی داشته باشه تا حالا ازش استفاده نکردم

آفلاین Fire.Phoenix

  • Full Member
  • *
  • ارسال: 108
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #10 : 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:52 ق‌ظ توسط Fire.Phoenix »

آفلاین 藤沼

  • Sr. Member
  • *
  • ارسال: 414
  • جنسیت : پسر
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #11 : 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، 06:11 ب‌ظ توسط n3vtelen »

آفلاین احسان فعالپور

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #12 : 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  میچسبونه و یه . اضافه میاد.
عضو ارشد فدراسیون بیکاران ایران FBI

آفلاین 藤沼

  • Sr. Member
  • *
  • ارسال: 414
  • جنسیت : پسر
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #13 : 20 دی 1394، 07:00 ب‌ظ »
دقیقاً چرا سعی دارید تا جایی که ممکنه تنها از ‌یک دستور و گزینه‌های اون استفاده کنید؟!

نقل‌قول از: Doug McIlroy
.Write programs that do one thing and do it well
« آخرین ویرایش: 20 دی 1394، 07:34 ب‌ظ توسط n3vtelen »

آفلاین 藤沼

  • Sr. Member
  • *
  • ارسال: 414
  • جنسیت : پسر
پاسخ : مشکل در اجرای اسکریپت در هر پوشه
« پاسخ #14 : 20 دی 1394، 07:04 ب‌ظ »
حذف شود.
« آخرین ویرایش: 20 دی 1394، 07:34 ب‌ظ توسط n3vtelen »