এক্স, ওয়াই এবং জেড ফাইল বাদে কোনও ফোল্ডারে সমস্ত ফাইল মোছা হচ্ছে


17

আমার একটি নির্দিষ্ট ফোল্ডারে প্রচুর ফাইল এবং ফোল্ডার রয়েছে এবং আমি সেগুলি সব মুছতে চাই; তবে আমি এক্স, ওয়াই এবং জেড ফাইলগুলি রাখতে চাইছিলাম

আমি কি কিছু করার মতো উপায় আছে: rm * | but NOT grep | X or Y or Z


আমি ধরে নিই আমি সেখানে কিছু নিয়মিত ভাব প্রকাশ করতে পারি যা এটি করবে?
অমিত

উত্তর:


16

পরিবর্তে RM ব্যবহার করে, এটা ব্যবহার করা সহজ হতে পারে খোঁজ । এর মতো একটি কমান্ড হ'ল 'ফাইল' নামের একটি ফাইল বাদে সবকিছু মুছে ফেলবে

find . \! -name 'file' -delete

এর অনেকগুলি সংস্করণ গ্লোব্বিং এবং নিয়মিত এক্সপ্রেশন মেলাকে সমর্থন করতে সক্ষম হওয়া উচিত।

আপনি আরএম-এর পাশাপাশি আউটপুটটি পাইপ করতে পারেন

find . \! -name '*pattern*' -print0 | xargs --null rm 

3
আর এই আপনি দেখতে ঠিক কি ফাইল মুছে মুছে ফেলা হবে দেয় -deleteসেইসাথে করে ফাইলগুলি কি সংরক্ষিত হবে সরানোর -deleteএবং \!
শন জে গফ

1
সাবধান, findপুনরাবৃত্তি! ' প্যাটার্ন ' এর সাথে মেলে না এমন সমস্ত ফাইল উপ-ডিরেক্টরিগুলিও মুছে ফেলা হবে
আলেকজান্দ্রে হোল্ডেন ডালি

এক্সারেগের মাধ্যমে ফাইলগুলি অন্তর্ভুক্ত করার আগে ডিরেক্টরিগুলি মুছে ফেলার প্রচেষ্টা রোধ করার জন্য - প্রস্থের প্রয়োজন। তবে, আমি মনে করি rm ডিরেক্টরিগুলি সরাবে না।
ব্যবহারকারী অজানা

9

অপারেটরটি setopt EXTENDED_GLOBব্যবহার করে ~( বাদে ) zsh ব্যবহার করে

rm -- *~(x|y|z)

বা ^অপারেটর (অবহেলা):

rm -- ^(x|y|z)

তবে, সম্ভবত আপনার পরিবর্তে ফাইলগুলি অন্যত্র সরিয়ে নেওয়া উচিত, তারপরে সবকিছু মুছুন। এটি আঙুলের স্লিপগুলির ক্ষেত্রে আরও বেশি নিরাপদ, যেমন খুব শীঘ্রই প্রবেশ করানো।


5

বাশের পরবর্তী সংস্করণগুলিতে extglobশেল বিকল্প রয়েছে যা আপনাকে যা করতে চান তার একটি বাক্য গঠন দেয় (আপনার ইনস্টলিত সংস্করণটি আছে কিনা তা দেখতে "পাথনাম এক্সপেনশন" এর অধীনে আপনার ম্যান পৃষ্ঠাটি পরীক্ষা করুন):

$ shopt -s extglob  # turn on extended globbing
$ rm !(X|Y|Z)

পরীক্ষা করার জন্য, আমি সুপারিশ করছি প্রথম প্রতিস্থাপন rmসঙ্গে echoযদি ফাইলের তালিকা মুছে ফেলা হবে কি আপনি আশা করতে কিনা দেখতে।


5
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r

মনোযোগ দিন: কমান্ডটি চালান এবং যদি ফাইলগুলি মুছতে হয় তবে সঠিকভাবে তা পুনরায় চালনা করুন এবং হ্যাশ অক্ষর মুছুন "#"।

যদি ফাইলের নামগুলি আরও জটিল হয় তবে তা করুন

ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r

আবার, ফলাফলগুলি দেখুন এবং তারপরে হ্যাশ চিহ্নটি সরান।

এই সংস্করণ - মন্তব্যে প্রস্তাবিত হিসাবে - কিছু অক্ষর সংরক্ষণ করে এবং আরও পরিষ্কার দেখায়।

ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r

ডিডিমেকের প্রস্তাবিত সম্পাদনাটি হ'লegrep যুক্তিটি পরিবর্তন করতে হবে"^(file1|filename2|f1le)$"
মাইকেল মরোজেক

আপনি তিনটি ফাইল থাকে, তাহলে a, bএবং a bপ্রথম প্রোগ্রাম মুছে ফেলবে - আপনি, grep অংশে AB করা: "^[ab]$" aএবং bকিন্তু a b, আপনার উদ্দেশ্য বিরোধিতা। দ্বিতীয় কমান্ড একই কাজ করবে। এবং তৃতীয়ও। খুব, খুব বিরল ব্যতিক্রম সহ আপনার স্ক্রিপ্টগুলিতে 'এলএস' ব্যবহার করা উচিত নয়। শুধু এটা করবেন না।
ব্যবহারকারী অজানা

3

আপনি যে ফাইলগুলি রাখতে চান তা সরান Move এক স্তর উপরে যান, ফোল্ডার মুছুন। ফোল্ডারটি পুনরায় তৈরি করুন এবং সেই ফাইলগুলি আবার সরিয়ে দিন।


বিস্মিত হলাম কেন বিয়োগ? .. এটি অন্যের প্রস্তাবিত যে কোনও কিছুর চেয়ে আসলে সহজ এবং নিরাপদ: আপনি কেবল ফাইলের নামটিতে কিছু বিশেষ চরকে আঘাত করে একটি পাতে নিজেকে গুলি করতে পারবেন না।
অ্যালেক্স

ক) আপনি নিজের ফাইল এক্স এক ডিরেক্টরি উপরে নিয়ে যান, যেখানে একটি ফাইল এক্স উপস্থিত রয়েছে - নিঃশব্দে মোছা, চলে গেছে। খ) আপনি শীর্ষের দিকে আছেন, যেখানে কোনও 'আপ' বিদ্যমান নেই। গ) আপনি নিজের বাড়িতে আছেন , এবং / বাড়িতে লেখার অনুমতি নেই। যদি আপনি কোনও পরামর্শ কোনও স্ক্রিপ্টে রাখেন এবং সমস্যা ছাড়াই এটি পরীক্ষা করেন এবং এমন পরিস্থিতিতে ব্যবহার করেন - পেং!
ব্যবহারকারী অজানা

2
ক) আরে, আমি কি বলেছি 'ফাইলগুলিকে এক স্তর উপরে নিয়ে যাওয়া '? আমি বলেছি তাদের সরিয়ে দাও। খ) সুতরাং আপনি সমস্ত ফাইল মুছে ফেলার চেষ্টা করছেন /, হি? খুব ব্যবহারিক নয়। গ) আপনার সমস্ত ফাইল মুছে ফেলার চেষ্টা করা $HOMEআসলেই বাস্তব নয়।
অ্যালেক্স

আপনি ঠিক বলেছেন, আমি দুঃখিত।
ব্যবহারকারী অজানা

0

এটি আমি একটি OSX / MacOS লগআউট হুকের জন্য .sh স্ক্রিপ্ট হিসাবে সেট আপ করেছি, যথেষ্ট ভাল কাজ করে।

#! /bin/bash
for dir in /PathToFolder/*
 do
    if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then 
      echo ${dir}
      sudo rm -R $dir user
      dscl . -delete $dir
    fi 
  done

exit 0

0

জিএনইউ-ফাইন্ডের সাহায্যে আপনি-ডিলিট স্যুইচটি ব্যবহার করতে পারেন, যা খালি থাকলে ডিরেক্টরিগুলি সরিয়ে দেয়:

 find tmp -not -name X -not -name Y -not -name Z -delete 

যদি এক্স, ওয়াই বা জেড ডিরেক্টরি হয় তবে এটি তাদের ভিতরে থাকা ফাইলগুলিও মুছে ফেলবে। find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -deleteএটিকে ঘিরে কাজ করার এক উপায়।
গিলস 'অশুভ হওয়া বন্ধ করুন'

যেহেতু ইউনিক্সের অধীনে ফোল্ডারগুলি ফাইল (যে কোনও ফাইলই ফাইল), এটি সম্ভবত উদ্দেশ্য। প্রশ্নটি স্পষ্টভাবে বলে: "একটি নির্দিষ্ট ফোল্ডারে আমার কাছে প্রচুর ফাইল এবং ফোল্ডার রয়েছে এবং আমি সেগুলি সব মুছতে চাই;" - এবং আপনি যদি Y কে বাদ দিতে চান, সম্ভবত আপনি জানেন যে Y একটি ডিরেক্টরি কিনা।
ব্যবহারকারী অজানা

যে মোছার শেষ হবে tmpযদি কোন ছিল পাশাপাশি X/ Y/ Zতাতে ফাইল। জিএনইউ'র !মানক সমতুল্য হিসাবে নোট করুন -not( -deleteএটিও একটি জিএনইউ এক্সটেনশন)
স্টাফেন চেজেলাস

@ স্টাফেনচেজেলাস: প্রশ্ন থেকে, ফোল্ডারগুলি মুছে ফেলা (সেগুলির সবগুলি) যা চাওয়া হয়েছিল। যেহেতু ঠুং শব্দটির মাস্কিং দরকার, তাই আমি টাইপ-নোট পছন্দ করি। জার্মান কীবোর্ড লেআউটের উপর নির্ভর করতে পারে, যেখানে ব্যাকস্ল্যাশ-এর ​​আল্ট-জিআর প্রয়োজন।
ব্যবহারকারী অজানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.