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

کمک و پشتیبانی => برنامه‌سازی => نویسنده: بهروز رمضانی در 14 بهمن 1394، 06:59 ب‌ظ

عنوان: اسکریپت ساخت دایرکتوری ( حل شد)
ارسال شده توسط: بهروز رمضانی در 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، 07:23 ب‌ظ
فقط دوتا گیومه بذار و اینکه از فاصله هم برای اسم پوشه استفاده نکنی بهتره.
mkdir -p "/home/behrooz/sss er/$name"
عنوان: پاسخ : اسکریپت ساخت دایرکتوری
ارسال شده توسط: بهروز رمضانی در 14 بهمن 1394، 07:26 ب‌ظ
مطمئنی این آدرس درسته؟
/home/behrooz/sss er/*.mkv
اره درسته مخصوصا بین اسم دایرکتوری اخری فاصله گذاشتم ببینم چطور باید ادرس دهی کنم. از  "" هم استفاده کردم اما نشد.
عنوان: پاسخ : اسکریپت ساخت دایرکتوری
ارسال شده توسط: بهروز رمضانی در 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
عنوان: پاسخ : اسکریپت ساخت دایرکتوری
ارسال شده توسط: 藤沼 در 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 در دایرکتوری‌های تودرتور و روش بازگشتیه.
عنوان: پاسخ : اسکریپت ساخت دایرکتوری
ارسال شده توسط: Nelliel در 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، 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 در دایرکتوری‌های تودرتور و روش بازگشتیه.
ممنون همین اسکریپت کارم را انداخت