یه مشکلی که همیشه داشتم این بود که کلی فایل تصویری بود که از یوتیوب و این ور اونور می گرفتم. وقتی می خواستم این ها را به mp3 تبدیل کنم تا بتونم توی ماشین هم گوش بدم ، کلی زمان از دست می دادم . باید می شستم دونه دونه تبدیل می کردم و منتظر تمام شدن هر کدوم می شدم.
پس تصمیم گرفتم یه راه حل پیدا کنم که با یه اسکریپت همه را خودش تغییر بده. اونقدر ها هم سخت نبود ، فهمیدم فقط تنبلی باعث می شده که من این کار را انجام ندم. 🙂
این هم اسکریپت نهایی شده:
OIFS=$IFS
IFS=$(echo -en “\n\b”)for i in `ls *.mp4` ;
do ffmpeg -i “$i” “${i%.*}”.mp3 ;
doneIFS=$OIFS
خوب توی همین چند خط چندین نکته نهفته است. یا بهتر بگم چندین مورد آموزشی:
اول از همه متغیر محیطی IFS یا Internal Field Separator : این متغیر مشخص می کنه که جدا کننده بین ورودی های یک نرم افزار را چی مشخص می کنه . به صورت پیشفرض فاصله هست. ولی در اینجا ما اون را تغییر دادیم تا با خروجی ls هماهنگی داشته باشه. فقط نکته ای که نمی دونم اینه که به چه شکل می شه فهمید که خروجی یک دستور از چه کاراکترهایی برای جداسازی خروجیهاش استفاده می کنه. متغیر OIFS هم برای این مشخص شده که آخر اسکریپت بتونیم مقدار پیشفرض متغیر IFS را بهش برگردونیم.
یه بخش دیگه داخل دستور ffmpeg هم هست که از variable mangling استفاده کردم: ${i%.*} این دستور از آخر تا نقطه اول که در حقیقت پسوند فایل هست را حذف می کند و بعد به جای آن mp3 را قرار دادم.
همین … به همین سادگی
4 پاسخ
اسکریپت خوب و آموزندهایه. دستتون درد نکنه.
فقط فکر کنم اون IFS رو تغییر ندین هم بدون مشکل کار کنه روی خروجی ls
۲ تا نکته هم من بگم با اجازه: تو این مثال خاص (و جاهای دیگه که از قالبهایی برای تطبیق شدن با اسم فایلها و شاخهها استفاده میشه)، نیازی به ls نیست، مثلا:
for i in *.mp4; do
ffmpeg -i “$i” “${i%.*}”.mp3 ;
done
خود شل اینجا mp3.* رو با اسم تمامی فایلهایی که پسوند mp3 دارند جایگزین میکنه.
در پایان، فرصت کردین یه سری هم به دستور find بزنید، برای کارهای پیچیده تر کمک زیادی میکنه (مثلا تبدیل هر چی فایل mp4 توی یک شاخه و همهی زیرشاخههاش هست به mp3 با یک خط دستور)
مرسی هدایت جان
من با خروجی ls مشکل داشتم برای همین از ifs استفاده کردم. شاید هم مشکل یه چیز دیگه بوده و من یه راه حل بی ربط دادم 😉
مرسی از پیشنهاد for بدون ls. متاسفانه کم تجربه ام هنوز تو شل اسکریپت.
یه مورد می مونه اینکه چطوری میشه کاراکتر های نامعلوم توی خروجی ها را کشف کرد. اگه در این مورد راهنمایی داری ممنون می شم بگی
راستش من تا حالا نیاز پیدا نکردم کاراکترهای نامعلوم توی خروجی رو کشف کنم. اما اگه یه راه حل بخواین که تقریبا همیشه و برای کاراکترهای غیرقابل نمایش جواب بده، یه راه حلش که الان به ذهنم میرسه استفاده از hexdump -Cه، مثلا:
ls | hexdump -C
این شکلی میتونید نمایش اسکی و مبنای ۱۶ خروجی رو با هم داشته باشید. البته یکمی خوندنش سخت میشه ولی خب!
مرسی هدایت داری پیگیری می کنی. راستش من امروز یهو یادم اومد که این موضوع کاراکتر ها توی lpic بود.
من قبلا می خوندم می گفتم آخه این به چه درد می خوره توی همه کتابها می یارند 😛
ls | od -c
فقط مشکلی که هست اینه که توی خروجی این دستور هم اثری از b\ نیست و فقط n\ را نشان می ده. و من دوباره تست کردم در صورتی که از ls توی for استفاده کنی بدون تغییر ifs اسکریپتت کار نمی کنه.
و با کشف دستورات مورد نظر وجود b\ همچنان در هاله ای از ابهام باقی می مونه 😉