انجمنهای فارسی اوبونتو
کمک و پشتیبانی => انجمن عمومی => نویسنده: Mr-virus در 26 آبان 1397، 04:30 بظ
-
سلام دوستان.بنده یک سوال دارم.فرض کنید قصد دارید تمام فایل های موجود در یک دایرکتوری رو حذف کنید به استثنای file_a.
سوالم این هست چطور اینو استثنا کنیم؟
-
سلام چندتا راه هست برای اینکار/
مثلا میتونید اون فایل هایی رو که نمیخوای حذف یا جابجا کنی رو اول به جای دیگه انتقال بدی بعد کاری که میخواید رو انجام بدید./
یا اینکه میتونید از دستور find همه ی فایل هایی که میخواید روش کاری انجام بدین رو به استثنائ یک سری دیگه انتخاب کنید بعد حالا روش هر دستوری رو اعمال کنید :
find . -type f ! -name 'file_a' -exec rm -f {} \;
در اون قسمتی که حرف دات رو نوشتم دقیقا بعدا کلمه ی کلیدی find به معنای اینکه در همین پوشه ای که داخلش هستیم عمل سرچ رو انجام بده و اون علامت تعجب به معنای not هست که میتونید به جاش از -not هم استفاده کنید و اون سوییچ -name هم همون فایل هایی هستن که نمیخواید روشون کاری انجام بده ./ و در آخر سوییچ exec هست که بعد از این سوییچ میتونید هر دستوری رو قرار بدید و اون دستور روی تک تک فایل هایه پیدا شده اعمال میشه که من اینجا از دستور rm استفاده کردم. در نتیجه همه ی فایل های درون همین پوشه به استثنائ فایل file_a رو حذف میکنه.
حالا شما میتونید به جای دستور rm دستور mv بذارید :
find . -type f ! -name 'ff' -exec mv {} FOLDER \;
اینجا هم هرچی پیدا کرد رو انتقال میده تو پوشه ی FOLDER.
راه های دیگه ای هم هست. اما خودم بشخصه یا اونایی که میخوام رو اول جدا میکنم. یا این کار رو میکنم
نکته ی دیگه ای هست اینکه خود دستور find سوییچ delete داره یعنی میتونید دیگه از سوییچ exec استفاده نکنید همون جا فقط کافیه بنویسید -delete تا عمل حذف رو بر روی تک تک فایل های پیداشده انجام بده. :
find . -type f ! -name 'file_a' -delete
توصیه میکنم اول خوب این دستور رو امتحان کنید اگر باهاش اشنایی ندارید (حتما گوگل کنید در مورد دستور find ) بعد اینکار رو انجام بدین چون ممکنه به اشتباه فایل هاتون رو حذف کنید و دیگه بر نگرده
موفق باشید
-
سلام و خیلی ممنونم بابت وقتی که اختصاص دادید.در واقع من میخوام بدون جابجا کردن این کارو انجام بدم.در مثالی که زدید نمیتونم استفاده کنم.چون فرض کنید من فقط اسم فایلی که قرار هست حذف بشه رو دارم و اسم بقیه فایل هارو نمیدونم یا اسم ها متفاوت هستن و از یک سری نیستن و تعداد خیلی زیاد هست.مثلا برای حذف همونطور که خودتون میدونین از
rm -f *
استفاده میکنیم و اینطوری تمام فایل ها در مسیر جاری یا مشخص شده حذف میشن.اما من میخوام اگر فایلی با اسم file_a بود اون فایل حذف نشه.
-
سلام / خواهش میکنم
خب اگر نمیتونید جابجاشون کنید ./حتما باید دو قسمتش کنید یعنی یه جوری فایل هایی که قراره حذف بشه و اون هایی که قرار نیست حذف بشن رو جدا کنید.(مثلا بگید فایل هایی که آخر اسمش مثلا با ali.txt تموم میشه رو حذف نکن و یا اینکه بگید فایل هایی که اسمش با reza شروع میشه رو حذف کن)
یا اینکه بگید فایل هایی که حجمش بیشتر از فلان مقدار هست رو حذف کن یا بگید فایل هایی که از این تاریخ به بعد اضافه شده رو حذف کن یا حذف نکن خلاصه یجوری باید این دوتا رو از هم متامیز کنید و در نهایت اون فعلی که میخواید را روش پیاده کنید :
تو مثالی که من براتون زدم همه ی فایل های اون پوشه رو حذف میکنه به جز فایل هایی که اسمشون file_a هست :
find . -type f ! -name 'file_a' -exec rm -f {} \;
حالا شما میتونید بگید فقط فایل هایی رو حذف کن که اولش با ali شروع میشه : (با استفاده از همان سوییچ name)
find . -type f -name 'ali*' -exec rm -f {} \;
یا مثلا بگید فایل هایی رو حذف کن که آخرش با پسوند .mkv تموم میشه :
find . -type f -name '*.mkv' -exec rm -f {} \;
یا مثلا فایل هایی رو حذف کن که حرف سومش عدد باشه :
find . -type f -name '??[0-9]*' -exec rm -f {} \;
یا فایل هایی رو حذف کن که حرف چهارمش کاراکتر a نباشه:(دقت کنید اینجا علامت تعحب گذاشتم که بهش بگم همه رو حذف کن به جز اونایی که حرف چهارمشون کاراکتر a نباشه)
find . -type f ! -name '???a*' -exec rm -f {} \;
همینجوری میتونید اونایی که میخواید رو غربال کنید و حذفشون کنید./
علامت * به معنای این هست که هر کاراکتری (چه عدد باشه چه حروف الفباباشه چه هرچیز دیگه ای که بود و به هر تعدادی)
علامت ؟ هم به معنای این هست که فقط یک کاراکتر و اون کاراکتر هم هرچیزی میتونه باشه
علامت سوال فرقش با ستاره اینکه علامت سوال فقط (یک حرف یا یک کاراکتر رو در نظر میگیره) ولی علامت ستاره به معنای هرچندتا کاراکتر که بود رو در نظر میگیره
برای خوندن مطالب بیشتر در رابطه با دستور find :
https://www.tehranhost.com/35-%D9%85%D8%AB%D8%A7%D9%84-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1-find-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3/
-
درود،
اگر از پوستهی bash استفاده میکنین با این دستور میتونین این کار رو انجام بدین:
rm -- !(file_a)
اگر بین فایلها، پوشه هم وجود داره باید اینطوری عمل کنین:
rm -rf !(file_a)
در zsh هم به این صورته:
rm -- ^file_a
rm -rf ^file_a
-
ممنون.
اگر بخوام چند فایل یا دایرکتوری رو استثنا کنم به چه صورت هست؟داخل براکت قرار دادم ارور داد و با کالن هم جدا کردم داخل پرانتز کالن رو جزئی از اسم فایل میدونه و بقیه رو حذف میکنه و در نتیجه همه حذف میشن.
-
ممنون.
اگر بخوام چند فایل یا دایرکتوری رو استثنا کنم به چه صورت هست؟داخل براکت قرار دادم ارور داد و با کالن هم جدا کردم داخل پرانتز کالن رو جزئی از اسم فایل میدونه و بقیه رو حذف میکنه و در نتیجه همه حذف میشن.
خواهش میکنم.
باید از کاراکتر پایپ "|" استفاده کنین.
با فرض اینکه شما یه فایل دیگه با نام file_b دارین میشه به این صورت:
rm -rf !(file_a|file_b)
-
اوووف! بابا به جای اینهمه فرمان و کد نویسی، از مدیر فایل ranger استفاده کنید! این مدیر فایل توانایی انتخاب گزینشی فایل ها و فولدرها را دارد، قابلیتی که متاسفانه من تا حالا ندیدم هیچ مدیر فایل گرافیکی آن را داشته باشد، کار کردن با ranger بسیار آسان است و سرعت بسیار بالایی هم دارد، یک قابلیت بسیار جالب آن، توانایی انتخاب یک فایل برای کپی شدن، و افزودن موارد بیشتر برای کپی شدن پس از آن است و سپس پیست کردن همه آنها، بازهم قابلیتی که در مدیر فایلهای گرافیکی وجود ندارد.
https://en.wikipedia.org/wiki/Ranger_(file_manager)
بسیار سریع و کم حجم
-
متشکرم از همه دوستانی که مشارکت کردن و پاسخ دادن