چرا گنو/لینوکس رو دوست دارم: انتقال کلی کتاب به پوشه هم نامشون

یک دوست ایمیل زده که:

۱۲۰۰ تا کتاب دارم که همه در یک دایرکتوری هستن. می خوام یک دایرکتوری برای هر یک کتاب ساخته بشه و کتاب بره توی دایرکتوری خودش. یعنی می خوام ۱۲۰۰ تا دایرکتوری بسازم و هر کتاب رو کپی کنم سر جاش.

چراش رو من نمی دونم… ولی چجوری اش رو می دونم: گنو/لینوکس پر از ابزارهای ریز است که هر کدوم برای کار خودشون بهترین هستن و ترکیب اینها باعث می شه بشه تقریبا هر چیزی ساخت. کل کار رو می شه توی یک خط انجام داد اما پیچیدگی با احتمال استفاده شدن فاصله در نام فایل بیشتر می شه. حتما روش های ساده تر هم هست اما من اینطوری نوشتم:

jadi@freebasse:/tmp/books$ cat ../p.sh
#!/bin/bash

SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for f in books/*
do
  mkdir "$f"_dir
  mv "$f" "$f"_dir/
  echo "$f"
done
IFS=$SAVEIFS

یک حلقه for است که همه فایل ها رو یکی یکی می ندازه وسط دایره. هر کی وسط باشه اول یک فولدر براش ساخته می شه با _dir و بعد یک mv روش اجرا می شه و خلاص. اون IFS متغیری است که توی بش تعریف می کنه جدا کننده فیلدها از هم باید چی باشه. معمولا اسپیس است اما چون اینجا ممکنه اسم فایل توش اسپیس داشته باشه، کردیمش «سرخط».

نکته: دوستم بعد از گرفتن این گفت که کامپیوتر ویندوزی است (: کماکان راحته. کافیه یک اوبونتو یا هر توزیع لینوکس دیگه دانلود کنید، روی یو اس بی نصبش کنین و لایو بوت کنین و این کارها رو انجام بدین و دوباره بوت کنین و برگردین توی ویندوز عزیز. مثل همیشه: بک آپ فراموش نشه!

آپدیت: دوست خوبم مهدی بیگی توی کامنت ها این شیوه راحت تر و بهتر رو پیشنهاد داده:


find -type f -exec mkdir '{}'.tmp \; -exec mv '{}' '{}'.tmp \; -exec mv '{}'.tmp '{}' \;

که فقط یک دستور است. دستور find می تونه چیزهای مختلف رو پیدا کنه و اینجا با سوییچ f دنبال فایل می گرده. بعد روی تک تک اون فایل ها چیزی که جلوی سوییچ exec هست رو اجرا می کنه و هر بار به جای {} یکی از فایل های پیدا شده رو می ذاره. در نهایت هم اسلش سمی کالن می گه چیزی که جلوی سوییچ exec بوده تموم شده.

  • Amir Masoud

    حتما یه نگاهی به این بنداز اگر ندیده باشیش البته: http://calibre-ebook.com/download_windows
    خیلی خیلی خوبه برای هر سیستم عاملی هم هست. برای مدیریت کتاب واقعا عالیه

    • جادی

      بعله اون عالیه. من که استفاده کننده همیشگی هستم. سوال کننده هم چون خواننده است حتما تست می کنه (:

  • این قدر تو سر ویندوز نزنید! :) ویندوز هم Windows Script Host داره که می شه باهاش اسکریپت نویسی کرد (جاوااسکریپت یا VBScript). البته اینو فکر کنم با یه batch فایل ساده هم بشه حلش کرد.

    • جادی

      حسن: خب اونو من بلد نیستم دیگه (: من راه حل لینوکسی دادم. واقعا تو سرش نزدم. در قدم آخر معلوم شد ویندوزی است کامپیوتر. منطقی تر همینه که یک بچ فایل بنویسن تو خود ویندوز هم.

  • kal

    جادی جان با پایتون می نوشتی اینقدر برای اون بدبخت دردسر درست نمی کردی بهت پیشنهاد می دم برای کارهای اینجوری از ابزارهای یک سیستم عامل خاص استفاده نکنی فکر کنم این اسکریپت کارشو راه بندازه
    http://www.mediafire.com/?gdlze5agz9sgerl

  • قبول نیست تو تقلب کردی ، قشنگیش به این بود که دایرکتوری هر فایل دقیقا هم نام همون فایل باشه ، با گذاشتی dir_ بعد از اسم فایل تقلب کردی ، قبول نیست :دی

    • جادی

      هواهاها.. خب مهدی اگر می خواستی اونطوری باشه اول باید منتقل می کردم تو tmp بعد دایرکتوری می ساختیم بعد از tmp می آوردیم اینجا. اصلا سخت نبود. ولی می خواستم «کد» حداقل پیچیدگی رو داشته باشه

  • کیوان

    نیازی به اوبونتو نبود بیشتر ابزارهای لینوکسی رو میشه روی cygwin داشت. من که همیشه روی ویندوزم نصب شدشو دارم. برای برنامه نویسی چند پلتفرمی خیلی ابزارهای خوبی داره. البته سرعتش یکم پایینه. پایتون و اسکریپت نویسی داخل ویندوز البته در اینجا راه حل های بهتری هستن که دوستان گفتن دیگه.

  • اینو یک نگاهی بنداز ، کلی وقت گذاشتم براش ، خدا بگم چیکارت کنه :

    find -type f -exec mkdir ‘{}’.tmp \; -exec mv ‘{}’ ‘{}’.tmp \; -exec mv ‘{}’.tmp ‘{}’ \;

    • جادی

      مهدی: به نظر که درست می یاد (: قول می دم دفعه بعد خیلی خیلی کمتر روش وقت بذاری. ایول داری (:

  • ` ها باید با سینگل کوتیشن ریپلیس بشه راهی هست که بشه توی کامنت ها کد گذاشت ؟ یا حداقل چپ به راستش کرد ؟

    • جادی

      نمی دونم راستش کامنت ها چقدر اجازه اچ تی ام ال می دن. الان کد تو رو تست می کنم و اگر درست بود اضافه می کنم به متن اصلی

  • واو ، مرسی

  • Drago

    برای یاد گرفتن بش چی پیشنهاد میدیدن؟ سایتی/کتابی چیزی معرفی میکنید؟

  • جادی می‌دونستی متن‌های توی ترمینال و ادیتور وبلاگت خیلی بد خونده می‌شن؟

    • جادی

      من توی براوزر خودم ، کروم و یک ویندوز که امتحان کردم خوب بودن. اگر دقیق بگی مشکل چیه بهتر می تونم نظر بدم. با چه براوزری؟ احتمالا جریان یک فونت است که من دارم و تو نداری. بگی با چه سیستمی خوشحال می شم اگر بتونم اصلاحش کنم.

  • جادی کار جالب بود ولی یکی پیدا شده وهمین مطلب رو بدون منبع زده
    ببین(از دست این آدما):
    http://degargoon.ir/12542

    • جادی

      حامد: ایشاء الله که خدا به کمرش بزنه (:

      • شاهد

        زد به کمرش ! داون شده!

  • Drago

    ممنون از پاسخت جادی جان :/
    چطور میتونم توی اسکریپت نوشتن واسه bash مسلط بشم؟

    • جادی

      دراگو: من که موظف نیستم به هر کامنتی که می یاد جواب بدم (: فروم پرسش پاسخ نیست که. راستش خودم بعد از نوشتن پست مثل یک خواننده باهاش برخورد می کنم. به هرحال… توی لیست کارها نوشتم که به طور کامل توضیح بدم پیشنهاد می کنم چطوری چیز جدیدی رو یاد بگیرین. چه شل چه پرل چه هر چی. امیدوارم فردا پس فردا بنویسمش.

  • Drago

    قبول دارم که الزامی ندارید! بابت پافشاری هم متاسفم.
    خوشحال میشم اون مطلب رو ببینم.

  • Pingback: چطوری اسکریپت نویسی بش یا هر چیز دیگه یاد بگیریم؟()

  • Pingback: چطوری اسکریپت نویسی بش یا هر چیز دیگه یاد بگیریم؟ | دگرگون()