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

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

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


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

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

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

آفلاین abdossamad2003

  • Full Member
  • *
  • ارسال: 157
با سلام خدمت دوستان
در لینوکس دستوری وجود دارد که بتوان مثلا در یک فولدر تمامی فایلهای آن را پاک کرد به استثنای چند فایل با نام معلوم

با تشکر
« آخرین ویرایش: 26 بهمن 1396، 11:16 ب‌ظ توسط abdossamad2003 »

آفلاین Silvio Dante

  • High Hero Member
  • *
  • ارسال: 1221
  • جنسیت : پسر
  • Arch Linux
    • وبلاگ شخصی
خب چند فایلی که اسمشون مشخصه رو از اون فولدر بیار بیرون بقیه رو حذف کن و دوباره اون چند فایل رو بزار سر جاش. (البته فکر کنم اینو خودتون هم بدونید ;D )
« آخرین ویرایش: 26 بهمن 1396، 02:38 ب‌ظ توسط مهران :) »
به ما نگفته بودند ایران در زمان احمدشاه قاجار چگونه بوده است. همیشه به ما دادند، ما هم فکر کردیم باید می‌داده‌اند و تازه خیال می‌کردیم کم‌مان است باز هم می‌خواستیم!!
فریدون فرخزاد

آفلاین علی رزم دیده

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1244
  • جنسیت : پسر
  • ali76 سابق
با سلام
در لینوکس دستوری وجود دارد که بتوان مثلا در یک فولدر تمامی فایلهای آن را پاک کرد به استثنای چند فایل با نام معلوم
بله راه ها و دستورات مختلفی هست ولی شما می تونین از همون rm هم استفاده کنین که فرم کلیش این شکلیه:
rm !(exception1|exception2|...|exceptionn)برای مثال با این دستور میایم فایل هایی به اسم 1 تا 100 توی پوشه ی testfolder ایجاد می کنیم:
mkdir testfolder
for i in  {1..100}; do touch testfolder/$i; done
حالا مثلا می خوایم تمام فایل ها به استثنای اسامی 20 و 30 پاک شن:
cd testfolder && rm !(20|30)این طوری فقط فایل های 20 و 30 باقی می مونه

آفلاین abdossamad2003

  • Full Member
  • *
  • ارسال: 157
با تشکر از پاسخ دوست عزیز ali76
دستور شما در bash کار می کنه ولی در csh
اگه میشه معادل csh اون رو هم بگید
با تشکر

آفلاین علی رزم دیده

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1244
  • جنسیت : پسر
  • ali76 سابق
والا من الان بیرونم واس همون به csh دسترسی ندارم که ببینم این دستور جدید کار می کنه یا نه (با گوشی تایپ می کنم)
خودتون اینو یه تستی بکنین نتیجه رو بگین:
ls | egrep -v "20|30" | xargs rm

آفلاین abdossamad2003

  • Full Member
  • *
  • ارسال: 157
با تشکر از دوست عزیز
دستور در csh برای فایلها جواب می ده ولی دایرکتوریها را حذف نمی کنه مثلا اگر در یک دایرکتوری فایل و دایرکتوری های a,b,c,d وجود داشته باشه در bash می توان با دستور rm -rf !(a)می توان تمامی فایها و دایرکتوریها رو حذف کرد به استثنای a
ولی در csh دایرکتوری ها حذف نمیشه
ls | egrep -v "a" | xargs rmبه نظر شما چه تغییری در این دستور بدیم

آفلاین علی رزم دیده

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1244
  • جنسیت : پسر
  • ali76 سابق
بله در هر دو حالت دایرکتوری ها پاک نمی شن چون شما گفته بودین فایل ها رو پاک کنه و من دستور رو به همین شکل نوشتم.
حذف دایرکتوری با rm با سوییچ r ممکن هستش و در نتیجه شما می تونین با اضافه کردن این سوییچ در هر دو دستور مسیرها رو هم در کنار فایل ها حذف کنین.
بش:
rm -r !(20|30)csh:
ls | egrep -v "20|30" | xargs rm -r

آفلاین abdossamad2003

  • Full Member
  • *
  • ارسال: 157
شما از مرجع خاصی استفاده می کنید برای دستورات لینوکس یا اینکه از جستجوی اینترنتی یا ...

آفلاین علی رزم دیده

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1244
  • جنسیت : پسر
  • ali76 سابق
الان رو می گین یا کلا ؟
الان که نه ، حتی بخشی از کدا رو توی گوشی تایپ کردم و به لپ تاپ دسترسی نداشتم.
ولی قبلا کتابای زیر رو برای بش مطالعه کرده بودم:
نقل‌قول
bash Cookbook: Solutions and Examples for bash Users
Mastering Linux Shell Scripting
در کنار اینا man page ها خیلی خیلی مفیدن و سوییچ ها و ریز جزئیات رو می شه ازشون یاد گرفت.

در ضمن مشکلتون حل شد ؟ اگه شدش عبارت حل شد رو به عنوان اضافه کنید

آفلاین abdossamad2003

  • Full Member
  • *
  • ارسال: 157
در مورد man page اگه منظورتون دستور مانند باشه اینها این کدی که شما گفتید رو نگفته
man rmهمچنین man پوسته csh رو چه جوری میشه دید اگه پوسته پیش فرض لینوکس bash باشه

با تشکر

آفلاین علی رزم دیده

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1244
  • جنسیت : پسر
  • ali76 سابق
این دستورات چندین قسمت دارن و تنها از یک جز تشکیل نمی شن که شما بتونین عین همین دستور رو توی من پیج ببینین مثلا اینا :
دستور ls:
man lsخروجی این دستور لیست تمام فایل ها و مسیرهای موجود در یک مسیره
ولی مثلا مخفی ها رو نیشون نمی ده و اگه شما بخواین مخفی ها هم پاک شن باید از به جای ls از ls -A استفاده کنین به این صورت:
ls -A | egrep -v "20|30" | xargs rm -r
دستور egrep:
man egrepخروجی این دستور قسمتی از خروجی ls هستش که مطلوب ما هستش
سوییچ -v توی این دستور خروجی برعکس رو می ده یعنی هر چیزی جز اونایی که ما می نویسیم (مثلا اینجا می خوایم که لیست تمام فایل ها و مسیرها به جز 20 و 30 نشون داده بشه)
نقل‌قول
       -v, --invert-match
              Invert the sense of matching, to select non-matching lines.

عملگر یا:
توی اینجا "a|b" می گه هر کدوم که شامل a یا b هستن رو نشون بده.

دستور xargs:
man xargsبرای انتقال ورودی استاندارد به rm هستش که شامل لیستی از فایل ها هستش که ما می خوایم پاک بشه

و در نهایت دستور rm :
man rmبرای پاک کردن استفاده می شه که شما می تونین مثلا اطلاعات مربوط به سوییچ -r رو توی من پیج اون ببینین:
نقل‌قول
       -r, -R, --recursive
              remove directories and their contents recursively

در نهایت با کنار هم قرار دادن این بخش ها می تونین به دستوری که دادم برسین.

در ضمن man پیج پکیج ها توی بش و csh تفاوتی ندارن و به زدن man به خروجی یکسانی می رسین ولی خود بش یا csh هم man page دارن و اطلاعات خوبی رو در مورد ساختار و اسکریپت نویسی توشون بهمون می دن:
man bash
man csh

آفلاین abdossamad2003

  • Full Member
  • *
  • ارسال: 157
با تشکر
منظور من کد زیره:
rm !(20|30)اگه ما دستور man rm را اجرا کنیم هیچ توضیحی در مورد ! rm نداده است.

آفلاین علی رزم دیده

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1244
  • جنسیت : پسر
  • ali76 سابق
خواهش می کنم
اون ویژگی مربوط rm نیستش مربوط به بش هستش دقیقاً برای همین هستش که توی csh کار نمی کرد اینم تیکه ی مربوط به اون دستور توی man bash :
!(pattern-list)
Matches anything except one of the given patterns

فقط اگه مشکلتون حل شدش عبارت (حل شد) رو به عنوان اضافه کنین

آفلاین abdossamad2003

  • Full Member
  • *
  • ارسال: 157
با تشکر از دوست عزیز

آفلاین علی رزم دیده

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1244
  • جنسیت : پسر
  • ali76 سابق
با تشکر از دوست عزیز
خواهش می کنم خوشحالم مشکلتون حل شد