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

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

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

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

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

آفلاین بهروز رمضانی

  • High Hero Member
  • *
  • ارسال: 1111
  • جنسیت : پسر
  • Kakashi Hatake
    • ابونتو نیوز
اسکریپت ساخت دایرکتوری ( حل شد)
« : 14 بهمن 1394، 06:59 ب‌ظ »
سلام
من حجم زیادی فایل ویدئویی دارم روی هارد اکسترنالم که میخوام براشون دایرکتوری درست کنم و هر فایل را به دایرکتوری مروبط به خودش منتقل کنم.در اینترنت به دنبال یه اسکریپت برای این کار بودم و تونستم یه اسکریپت برای این کار پیدا کنم.
#!/usr/bin/env bash

## iterate through each file whose name ends in 'jpg'
## saving it as $file. ~ is your $HOME directory
for file in ~/Desktop/My_pictures/*jpg
do
    ## basename will remove the path (~/Desktop/My_pictures) and also
    ## remove the extension you give as a second argument   
    name="$(basename "$file" .jpg)"

    ## create the directory, the -p means it will create
    ## the parent directories if needed and it won't complain
    ## if the directory exists.
    mkdir -p ~/Desktop/My_pictures/"$name"

    ## copy the file to the new directory
    mv "$file" "~/Desktop/My_pictures/$name"
done
من اسکریپت را به این صورت تغییر دادم
#!/usr/bin/bash

## iterate through each file whose name ends in 'jpg'
## saving it as $file. ~ is your $HOME directory
for file in "/home/behrooz/sss er/*.mkv"

do
    ## basename will remove the path (~/Desktop/My_pictures) and also
    ## remove the extension you give as a second argument   
    name="$(basename "$file" .mkv)"

    ## create the directory, the -p means it will create
    ## the parent directories if needed and it won't complain
    ## if the directory exists.
    mkdir -p '/home/behrooz/sss er/"$name"'


    ## copy the file to the new directory
    mv "$file" "/home/behrooz/sss er/$name"

done
بعد از اجرا این ارور را میده
mv: cannot stat ‘/home/behrooz/sss er/*.mkv’: No such file or directory
و یه دایرکتوری به نام "$name" در ادرسی که اسکریپت در اون اجرا میشه ساخته میشه.
« آخرین ویرایش: 14 بهمن 1394، 11:35 ب‌ظ توسط بهروز رمضانی »
در یادگیری و استفاده از خط فرمان کوشا باشید چرا که رستگاری شما در آن است.

آفلاین 藤沼

  • Sr. Member
  • *
  • ارسال: 414
  • جنسیت : پسر
پاسخ : اسکریپت ساخت دایرکتوری
« پاسخ #1 : 14 بهمن 1394، 07:23 ب‌ظ »
فقط دوتا گیومه بذار و اینکه از فاصله هم برای اسم پوشه استفاده نکنی بهتره.
mkdir -p "/home/behrooz/sss er/$name"
« آخرین ویرایش: 14 بهمن 1394، 07:26 ب‌ظ توسط b|ackwolf »

آفلاین بهروز رمضانی

  • High Hero Member
  • *
  • ارسال: 1111
  • جنسیت : پسر
  • Kakashi Hatake
    • ابونتو نیوز
پاسخ : اسکریپت ساخت دایرکتوری
« پاسخ #2 : 14 بهمن 1394، 07:26 ب‌ظ »
مطمئنی این آدرس درسته؟
/home/behrooz/sss er/*.mkv
اره درسته مخصوصا بین اسم دایرکتوری اخری فاصله گذاشتم ببینم چطور باید ادرس دهی کنم. از  "" هم استفاده کردم اما نشد.
در یادگیری و استفاده از خط فرمان کوشا باشید چرا که رستگاری شما در آن است.

آفلاین بهروز رمضانی

  • High Hero Member
  • *
  • ارسال: 1111
  • جنسیت : پسر
  • Kakashi Hatake
    • ابونتو نیوز
پاسخ : اسکریپت ساخت دایرکتوری
« پاسخ #3 : 14 بهمن 1394، 07:55 ب‌ظ »
خوب من یکم با تست و خطا تونستم یه کارهایی بکنم. الان اسکریپت این شکلی شده
#!/usr/bin/bash

for file in ~/ss/*mkv
do
     name="$(basename "$file" .mkv)"

     mkdir -p ~/ss/"$name"

     mv "$file" ~/ss/$name
done
فعلا کار میکنه برای هر فایل با پسوند mkv یه دایرکتوری میسازه و اون فایل را منتقل میکنه به دایرکتوری همتاش اما چندتا ایراد داره :
۱− اگر در اسم قایل‌ها فاصله باشه اسکریپت ارور میده.
۲− ایا میشه کاری کرد که ادرس را به صورت داینامیک تعریف بشه مثلا با pwd
در یادگیری و استفاده از خط فرمان کوشا باشید چرا که رستگاری شما در آن است.

آفلاین 藤沼

  • Sr. Member
  • *
  • ارسال: 414
  • جنسیت : پسر
پاسخ : اسکریپت ساخت دایرکتوری
« پاسخ #4 : 14 بهمن 1394، 07:58 ب‌ظ »
۱− اگر در اسم قایل‌ها فاصله باشه اسکریپت ارور میده.
۲− ایا میشه کاری کرد که ادرس را به صورت داینامیک تعریف بشه مثلا با pwd
۱-همیشه کل مسیر رو درون دوتا گیومه بذار (برای جلوگیری از جدا فرض شدن اسم‌هایی که فاصله دارن) و توی آخرین خط حلقه متغیر $name رو درون دوتا گیومه نذاشتی.
۲-یکی از دغدغه‌های اصلی اون‌هایی که قصد همچین کارهایی رو دارند؛ مسیر مطلقه. درصورتی که مسیر مطلق اصلاً نیاز نیست برای همین باید به سبک Shell برنامه‌‌ بنویسی اونطور دیگه به آدرس مطلق نیاز نداری. |‌ منبع : http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29
#!/usr/bin/env bash
find . -iname "*.mkv" | while read -r filename; do
    if [[ ! "$filename" = . ]]; then
        name="${filename%.*}"
        mkdir -p "./$name"
        mv "$filename" "./$name"
    fi
done

مزیت استفاده از find به‌جای حلقهٔ for در دایرکتوری‌های تودرتور و روش بازگشتیه.
« آخرین ویرایش: 14 بهمن 1394، 08:28 ب‌ظ توسط b|ackwolf »

آفلاین Nelliel

  • High Hero Member
  • *
  • ارسال: 2151
  • جنسیت : پسر
  • Nelliel Tu Odelschwanck
پاسخ : اسکریپت ساخت دایرکتوری
« پاسخ #5 : 14 بهمن 1394، 09:58 ب‌ظ »
سلام
این اسکریپت شاید بتونه کمکت کنه :

#!/bin/bash
echo "Your files size : "$( du -h $HOME/Videos )""
for file in ~/Videos/*.mkv
do
     name="$(basename "$file" .mkv)"
     mkdir -p ~/ss/"$name"
     cp -R "$file" ~/ss/"$name"
     echo "Copying "$name" to ~/ss/"$name"..."
done

for i in ~/Videos/*.mp4
do
   name="$( basename "$i" .mp4)"
   mkdir -p ~/ss/"$name"
   cp -R "$i" ~/ss/"$name"
   echo "Copying "$name" to ~/ss/"$name"..."
done

من نسبت به فایل‌های خودم اینو نوشتم شما می‌تونی توش تغییرات ایجاد کنی :) این اسکریپت اول میگه کل فایل‌هایی که قرار پوشه‌سازی و اینا بشه حجمشون چقدره و بعد هم در حین کپی میگه که چه فایلی داره به چه دایرکتوری ریخته میشه که نخوای توی یه صفحه‌ی سیاه نگاه کنی و ندونی دنیا دست کی هست  ;D ;D

در ضمن نه تنها فایل‌های mkv بلکه‌ فایل‌های mp4 هم توش کپی میشن.
میشه حتی پراگرس بار هم باش درست کرد  ;) من که حال ساختش را ندارم چون زیاد ضروری نیست ولی اگه خواستی خودت درست کن  :)
« آخرین ویرایش: 14 بهمن 1394، 10:26 ب‌ظ توسط حسین حیدری »
طرفدار انیمه و مانگا - کاربر آرچ لینوکس

آفلاین بهروز رمضانی

  • High Hero Member
  • *
  • ارسال: 1111
  • جنسیت : پسر
  • Kakashi Hatake
    • ابونتو نیوز
پاسخ : اسکریپت ساخت دایرکتوری
« پاسخ #6 : 14 بهمن 1394، 11:30 ب‌ظ »
۱− اگر در اسم قایل‌ها فاصله باشه اسکریپت ارور میده.
۲− ایا میشه کاری کرد که ادرس را به صورت داینامیک تعریف بشه مثلا با pwd
۱-همیشه کل مسیر رو درون دوتا گیومه بذار (برای جلوگیری از جدا فرض شدن اسم‌هایی که فاصله دارن) و توی آخرین خط حلقه متغیر $name رو درون دوتا گیومه نذاشتی.
۲-یکی از دغدغه‌های اصلی اون‌هایی که قصد همچین کارهایی رو دارند؛ مسیر مطلقه. درصورتی که مسیر مطلق اصلاً نیاز نیست برای همین باید به سبک Shell برنامه‌‌ بنویسی اونطور دیگه به آدرس مطلق نیاز نداری. |‌ منبع : http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29
#!/usr/bin/env bash
find . -iname "*.mkv" | while read -r filename; do
    if [[ ! "$filename" = . ]]; then
        name="${filename%.*}"
        mkdir -p "./$name"
        mv "$filename" "./$name"
    fi
done

مزیت استفاده از find به‌جای حلقهٔ for در دایرکتوری‌های تودرتور و روش بازگشتیه.
ممنون همین اسکریپت کارم را انداخت
در یادگیری و استفاده از خط فرمان کوشا باشید چرا که رستگاری شما در آن است.