কমান্ড লাইনে নির্দিষ্ট ফাইলগুলি মোছা হচ্ছে


8

আমার কাছে ফাইলনেম_1 , ফাইলনাম_2 ... ফাইলনাম_100000 রয়েছে যেখানে ফাইলের নামগুলি ধারাবাহিকভাবে নম্বরযুক্ত রয়েছে। আমি 100 এর চেয়ে বেশি সূচকের ফাইলগুলি কীভাবে মুছতে পারি ?

উত্তর:


17

যদি ফাইলের নামগুলি ধারাবাহিকভাবে সংখ্যাযুক্ত হয় তবে কেবল নিম্নলিখিত কমান্ডটি চালান:

rm fileName_{100..100000}

3
তথ্য: এটি কাজ করে কারণ ব্যাশ (আপনার শেল) {x..y}পুরো তালিকায় প্রসারিত করবে । উদাহরণস্বরূপ আপনি যদি echo test{1..3}এটি ব্যবহার করেন তবে এটি প্রসারিত হবে echo test1 test2 test3এবং তারপরে কার্যকর করা হবে। আপনি দেখতে পাচ্ছেন, এটি প্রিন্ট করে test1 test2 test3। একইভাবে, যদি {x..y}কোনও যুক্তির সাথে সংযুক্ত না হয়, এটি কেবল সংখ্যাগুলি সেখানে রাখবে। যেমন echo test {1..3}শুধু মুদ্রণ করবে test 1 2 3
লুক

1
দ্রষ্টব্য: execএকটি প্রক্রিয়া থাকতে পারে যে আর্গুমেন্ট সংখ্যার কল দ্বারা একটি সীমাবদ্ধতা আছে। আপনি এটি দিয়ে পুনরুদ্ধার করতে পারেন getconf ARG_MAX। উদাহরণস্বরূপ আমার সিস্টেমে এটি 2097152(২.১ মিলিয়ন ডলার)। এর অর্থ হ'ল rm(যা কোনও অন্তর্নির্মিত নয়) এর চেয়ে অনেক বেশি ফাইলের সাথে ব্যর্থ হবে। অন্তর্নির্মিত কমান্ডগুলির মধ্যে এই সমস্যা নেই এবং অন্য সমাধানগুলির প্রস্তাবও নেই।
বাকুরিউ

নোট করুন যে ARG_MAX হ'ল সংখ্যক বাইট, আর্গুমেন্টের সংখ্যা নয়। আরএম একবারে 2097152 ফাইল মুছে ফেলা পরিচালনা করতে পারে না। এটি 2048 ফাইল মুছতে পারে যার প্রত্যেকটির নাম ছিল 1023 বাইট দীর্ঘ (1024 নয়; আর্গুমেন্টের মধ্যে সীমানার (সী-ল্যান্ডে 0 ডলার) সীমাতে গণনা করা)।
গডলিজিক 16'14

6

আপনি এই আদেশটিও চেষ্টা করে দেখতে পারেন,

for i in $(seq 100 100000); do rm fileName_$i; done

যদি ফাইলের নামটিতে অনুক্রমিক ক্রমে নম্বর থাকে তবে এটি সমস্ত ফাইল (100 থেকে 100000 অবধি) মুছে ফেলবে।


5

সাধারণভাবে আপনার এটি অর্জনের বিভিন্ন উপায় রয়েছে:

rm fileName_{100..100000}

শেল দ্বারা প্রায় 100,000 ফাইলের নামগুলিতে প্রসারিত হবে। যদি বেসনামটি দীর্ঘ পথ এবং সংখ্যাটি যথেষ্ট পরিমাণে থাকে তবে আপনি সম্ভবত এই পদ্ধতির সাথে একটি কমান্ড লাইনের সর্বাধিক দৈর্ঘ্য অতিক্রম করতে পারেন।

forলুপ

for i in $(seq 100 100000); do rm fileName_$i; done

এই সমস্যায় ভুগছেন না, তবে ফাইলগুলি মুছে ফেলার অপেক্ষাকৃত ধীর পথ, কারণ শেলটি পরিবর্তনশীল প্রতিস্থাপন এবং প্রায় 100,000 বার আরএম চালু করতে হয়।

উপরের দুটি পদ্ধতিই যদি কিছু ফাইল, filename_101অনুপস্থিত থাকে বলে সতর্কবার্তা তৈরি করতে পারে ।

সাধারণত, ভিত্তিক সমাধানগুলি findআরও ভাল হয়, কারণ তারা কেবল সেখানে উপস্থিত ফাইলগুলিতে কাজ করে (আবিষ্কারের সময়)। তবে কিছু সূক্ষ্ম পার্থক্য রয়েছে:

find . -name 'fileName_[100-100000]' -exec rm {} \;

এখনো আরম্ভ হবে rm, 100,000 বার সম্পর্কে প্রোগ্রাম যখন চূড়ান্ত প্রতিস্থাপন \;দ্বারা +subprocesses সংখ্যা কমানোর জন্য চেষ্টা করবে। উভয় পদ্ধতিই সম্ভবত ব্যবহারের চেয়ে ধীরে ধীরে (অনেক বেশি বা কিছুটা) ধীরে ধীরে হবে -deleteযা বাহ্যিক আদেশগুলি মোটেও ব্যবহার করে না তবে পরিবর্তে সিস্টেম কল আহ্বান করে।

যাইহোক, প্যাটার্নটি আপনি যে টার্গেট করতে চান সেই ফাইলগুলির সাথে আসলে মেলে কিনা তা সর্বদা চেক করুন:

stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]' 
askubuntu/filename_1

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


4

নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

find . -name 'fileName_[100-100000]' -exec rm {} \;

এটি 100 থেকে 100000 পর্যন্ত ফাইলগুলি মুছবে।

আরও তথ্য: সাইট


ব্যবহার করে আপনি ভাল হতে চাই +বদলে \;দেখুন - এখানে । অথবা, আরও ভাল, ফাইন্ডের -deleteকমান্ডটি ব্যবহার করুন ।
evilsoup

আমি এটি পরীক্ষা করেছি এবং এটি কেবল ফাইলনাম_1 কে মুছে ফেলেছে। [100-100000] চরিত্র শ্রেণী শুধুমাত্র একটি একক চরিত্র মিলে যায়, তাই এটি শুধুমাত্র 0 বা 1. মেলাতে পারে
deltab
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.