انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: بهروز رمضانی در 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" در ادرسی که اسکریپت در اون اجرا میشه ساخته میشه.
-
فقط دوتا گیومه بذار و اینکه از فاصله هم برای اسم پوشه استفاده نکنی بهتره.
mkdir -p "/home/behrooz/sss er/$name"
-
مطمئنی این آدرس درسته؟
/home/behrooz/sss er/*.mkv
اره درسته مخصوصا بین اسم دایرکتوری اخری فاصله گذاشتم ببینم چطور باید ادرس دهی کنم. از "" هم استفاده کردم اما نشد.
-
خوب من یکم با تست و خطا تونستم یه کارهایی بکنم. الان اسکریپت این شکلی شده
#!/usr/bin/bash
for file in ~/ss/*mkv
do
name="$(basename "$file" .mkv)"
mkdir -p ~/ss/"$name"
mv "$file" ~/ss/$name
done
فعلا کار میکنه برای هر فایل با پسوند mkv یه دایرکتوری میسازه و اون فایل را منتقل میکنه به دایرکتوری همتاش اما چندتا ایراد داره :
۱− اگر در اسم قایلها فاصله باشه اسکریپت ارور میده.
۲− ایا میشه کاری کرد که ادرس را به صورت داینامیک تعریف بشه مثلا با pwd
-
۱− اگر در اسم قایلها فاصله باشه اسکریپت ارور میده.
۲− ایا میشه کاری کرد که ادرس را به صورت داینامیک تعریف بشه مثلا با 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 در دایرکتوریهای تودرتور و روش بازگشتیه.
-
سلام
این اسکریپت شاید بتونه کمکت کنه :
#!/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 هم توش کپی میشن.
میشه حتی پراگرس بار هم باش درست کرد ;) من که حال ساختش را ندارم چون زیاد ضروری نیست ولی اگه خواستی خودت درست کن :)
-
۱− اگر در اسم قایلها فاصله باشه اسکریپت ارور میده.
۲− ایا میشه کاری کرد که ادرس را به صورت داینامیک تعریف بشه مثلا با 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 در دایرکتوریهای تودرتور و روش بازگشتیه.
ممنون همین اسکریپت کارم را انداخت