আমি নির্দিষ্ট কিছু ফাইল বাদে কীভাবে একটি ফোল্ডারে সমস্ত ফাইল সরিয়ে ফেলব?


11

আমি নির্দিষ্ট কিছু ফাইল রেখে গিয়ে একটি ডিরেক্টরিতে সমস্ত ফাইল সরিয়ে ফেলতে চাই, নামতে তাদের সাধারণ কিছু নেই। আমি কীভাবে এটি অর্জন করতে পারি?

উদাহরণস্বরূপ, আমি যে ফাইলের নাম রাখতে চাই তা হ'ল:

file_1.png, another_file.jpg,some_music.mp3

উত্তর:


15

আপনি যদি ব্যাশ ব্যবহার করছেন:

shopt -s extglob
rm -- !(file1|file2|file3)

প্রথম লাইনটি কেবল প্রসারিত প্যাটার্ন মেলানো সক্রিয় করে এবং এর পরে আমরা তাদের মধ্যে একটি ব্যবহার করি:

!(pattern-list) প্রদত্ত নিদর্শনগুলির মধ্যে একটি ব্যতীত অন্য কোনওটির সাথে মিলে

এবং প্যাটার্ন-তালিকাটি এক দ্বারা বিভক্ত এক বা একাধিক নিদর্শনগুলির একটি তালিকা |


বা সাথে zsh

setopt extendedglob
rm -- ^(file1|file2)

বা, আরও বহনযোগ্য, ব্যবহার করে find:

find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +

3
Shellচ্ছিক শেল আচরণটি ফিরে ( shopt -u extglob) কীভাবে ফিরিয়ে আনতে হবে তা অন্তর্ভুক্ত করা কার্যকর হতে পারে ।
geedoubleya

7

একটি সাব-ডাইরেক্টরি তৈরি করুন tmp, আপনি যে ডিরেক্টরিটি সেই ডিরেক্টরিতে রাখতে চান তার সমস্ত ফাইল সরান এবং rm -f *তারপরে একটি করুন । এটি tmpডিরেক্টরিকে প্রভাবিত করবে না ।

এর পরে ঠিক করুন:

mv tmp/* .
rmdir tmp

(ধরে নিলেন যে আপনি যে ফাইলগুলি সরিয়েছেন তার কোনওোটই ডট দিয়ে শুরু হয় না)।

এটি মাউস এবং নটিলাসের মতো একটি ফাইল ব্রাউজার ব্যবহার করার অর্থ Ctrlঅনুভূত হয়েছে যেখানে আপনি যে কয়েকটি ফাইল রাখতে চান তা ক্লিক করতে পারেন এবং তারপরে মেনুটি ব্যবহার করতে পারেন: Edit -> Invert Selectionঅন্যান্য ফাইলগুলি পেতে এবং তারপরে মুছে ফেলার জন্য ।


টিএমপি ডিরেক্টরিতে ফাইলগুলি মুভিং দুর্দান্ত লাগছে। যাইহোক, কমান্ড লাইন দিয়ে আমাকে এটি করতে হবে। ধন্যবাদ!
AGamePlayer

3
@ আউকিউরুইগুও টিএমপিটির সুবিধা রয়েছে যে এটি আপনি চান না এমনগুলি অপ্রত্যাশিতভাবে অপসারণের আগে এটি প্রথমে দুটি সেটে ফাইলগুলি আলাদা করে দেয়। সুতরাং আপনি lsসংরক্ষণ করতে চান এমন কোনও ফাইল মিস না করে তা দেখতে আপনি চালনা করতে পারেন ।
অ্যান্থন

2

প্রতি লাইনে একটি করে পাঠ্য ফাইলগুলিতে আপনি যে ফাইলগুলি রাখতে চান সেগুলির নাম যুক্ত করুন। এই ফাইলটি ডিরেক্টরিতে থাকা উচিত নয় বা আপনার নামটিও যুক্ত করা উচিত।

আপনার ডিরেক্টরিটির নাম যদি foo হয় এবং ফাইলটির নাম বার হয় তবে নিম্নলিখিতটি করুন।

find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm

এটি নিম্নলিখিতগুলি করে:

  1. find -type ffoo এবং এর উপ-ডিরেক্টরিগুলিতে সমস্ত ফাইলের নাম অনুসন্ধান করে সেগুলি STDOUT এ মুদ্রণ করে। বিকল্পের সাহায্যে -print0এটি ফাইলের নামগুলি NUL বাইটের সাথে সীমিত করে।
  2. grep -v -f barবারে একটি লাইনের সাথে মেলে এমন সমস্ত ফাইলের নাম বাদ দেয় । বিকল্পের সাহায্যে -zএটি তার -Zইনপুটটিকে NUL বাইট দ্বারা নির্ধারিত লাইনের একটি সেট হিসাবে বিবেচনা করে, বিকল্পের সাথে এটি তার আউটপুটটি NUL বাইট দিয়ে সীমানা করে।
  3. xargs rmrmফাইলগুলি মুছতে বারবার কল করে। বিকল্পের সাহায্যে -0এটি এর ইনপুটটিকে NUL বাইট দ্বারা বিসর্জনিত লাইনের একটি সেট হিসাবে গণ্য করে।

এটি সাদা স্থানযুক্ত ফাইলের সাথে কাজ করে।


ফাইলের নামগুলিতে সেগুলিতে নতুন লাইন থাকতে পারে বলে এটি কাজ করবে না।
অ্যান্থন

@ অ্যানথন নিউলাইন সহ হোয়াইটস্পেসযুক্ত ফাইলের নামগুলি মোকাবেলায় ফাইন্ড, গ্রেপ, এক্সার্গের বিকল্পগুলি পরিবর্তন করেছে
ম্যাথিয়াস ওয়েডনার

আপনি যদি ব্যবহার করতে চান তবে findআমি বরং করবfind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
jimmij
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.