নির্দিষ্ট আকারের পরিসরের ফাইলগুলি মুছুন


12

আমি ফাইলগুলি মুছতে চাই যা নির্দিষ্ট মানগুলির মধ্যে আকার is উদাহরণস্বরূপ আমার কাছে ফাইলগুলির নিম্নলিখিত তালিকা রয়েছে:

-rw-r--r-- 1 smsc sys  558 Apr 30 13:07 stats.sfe.1.20120430130513.xml.Z
-rw-r--r-- 1 smsc sys  388 Apr 30 15:32 stats.sfe.1.20120430153013.xml.Z
-rw-r--r-- 1 smsc sys  386 Apr 30 15:36 stats.sfe.1.20120430153513.xml.Z
-rw-r--r-- 1 smsc sys  389 Apr 30 15:42 stats.sfe.1.20120430154013.xml.Z
-rw-r--r-- 1 smsc sys  390 Apr 30 16:02 stats.sfe.1.20120430160013.xml.Z
-rw-r--r-- 1 smsc sys  385 Apr 30 16:12 stats.sfe.1.20120430161013.xml.Z

উপরের তালিকা থেকে, আমি কেবল ফাইলগুলি মুছতে চাই যা আকার 386b এবং 390b এর মধ্যে পরিবর্তিত হয় । আমি জানি যে আকারগুলি নির্দিষ্ট ছাড়িয়ে যাওয়া ফাইলগুলি মুছতে আমি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারি <size>:

find . -size +<size>-delete

তবে ফাইলগুলির জন্য আমি আরও একটি বাউন্ডারি কীভাবে যুক্ত করতে পারি যার আকার কোনও প্রদত্ত মানের চেয়ে কম?


4
findশর্তগুলি লজিক্যালি ডিফল্টরূপে AND'd হয়, সুতরাং কেবল অন্য গণ্ডির -sizeজন্য অন্য বিকল্পটি সন্ধান করুন।
— jw013

@ jw013 দুর্দান্ত! সেটা আমার জন্য কাজ করে. ধন্যবাদ! আপনার উত্তর হিসাবে এটি পোস্ট করুন এবং আমি এটি গ্রহণ করব।
— ইউজিন এস

উত্তর:


7

একটি ব্যাপ্তি কেবল একটি উপরের বাউন্ড এবং নিম্ন সীমা। findঅনুমান থেকে :

অভিব্যক্তি [-a] প্রকাশ

প্রাথমিকের সংমিশ্রণ; অ্যান্ড অপারেটরটি দুটি প্রাইমারীর সংক্ষিপ্ত অবস্থান দ্বারা বোঝানো হয় বা alচ্ছিক -a অপারেটর দ্বারা স্পষ্ট করে দেওয়া হয়। প্রথম অভিব্যক্তিটি মিথ্যা হলে দ্বিতীয় প্রকাশটি মূল্যায়ন করা হবে না।

সুতরাং আপনাকে যা করতে হবে তা হ'ল -deleteকর্মের আগে উভয় আকারের সীমা নির্দিষ্ট করা উচিত ।


8

-aএকটি সুনির্দিষ্ট মধ্যে ANDঅপারেটর যে আপনি দুই প্রাইমারিতে মিশান করতে পারবেন। এই ক্ষেত্রে ব্যবহার করে একটি পরিসীমা তৈরি করা -size।

find . -size +386b -a -size -390b -exec rm -f {} \;

নোটটি আকারটি এমন একটি সংখ্যাসূচক আর্গুমেন্ট যা allyচ্ছিকভাবে +এবং দিয়ে প্রেন্ডেন্ড করা যায় -। থেকে man 1 find:

   Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n      for exactly n.

আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। তবে @ jw013 তার মন্তব্যে যেমন উল্লেখ করেছেন, findশর্তগুলি যুক্তিযুক্তভাবে ডিফল্টরূপে AND'd করা হবে। সুতরাং আমি কেবল আরও একটি sizeশর্ত যুক্ত করেছি এবং এটি দুর্দান্ত কাজ করেছে! চূড়ান্ত কমান্ডটি দেখে মনে হচ্ছে:find . -maxdepth 1 -size +358c -size -395c -delete
— ইউজিন এস

7

যখনই findকোনও সংখ্যার প্রত্যাশা করে, আপনি +এই সংখ্যার চেয়ে বেশি অর্থ বোঝাতে আগে একটি চিহ্ন রাখতে পারেন, বা -এই সংখ্যার চেয়ে কম চিহ্ন হিসাবে একটি চিহ্ন রাখতে পারেন। এগুলি কঠোর বৈষম্য: +3এবং এর -7অর্থ 4, 5 বা 6।

সঙ্গে -sizeপ্রাথমিক, আপনি প্রত্যয় যোগ করতে হবে cইঙ্গিত যে সংখ্যা বাইটের একটি সংখ্যা। আপনি একাধিক প্রাথমিককে তাদের সংমিশ্রণ নিতে একত্রিত করতে পারেন (কিছু সংস্করণে, আপনি রাখতে পারেন -aবা -andতাদের মধ্যে রাখতে পারেন)। এভাবে:

find . -size +385c -size -391c -delete

Zsh এ, আপনি L গ্লোব কোয়ালিফায়ার ব্যবহার করতে পারেন । ডিফল্ট ইউনিট বাইট হয়; যেমন find, চরিত্রগুলি +এবং -কঠোর বৈষম্য নির্দেশ করে।

rm *(L+385-391)

(উপরের কমান্ডটি উপ-ডিরেক্টরিতে পুনরাবৃত্তি করবে না; যদি আপনার এটির প্রয়োজন হয় **/তবে প্যাটার্নের আগে যোগ করুন ))


আমি 4, 5 বা 6 এর সমমানের +3 এবং -7 বুঝতে পারি না আপনি ব্যাখ্যা করতে পারেন?
— হাশিম

1

একটি উপায় ব্যবহার perl:

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *

আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ! কোডের এই অংশটি কি একক লাইন হিসাবে প্রবেশ করা উচিত?
— ইউজিন এস

@ ইউজিনস: হ্যাঁ এটি আপনার কমান্ড লাইনে যেমন হয় তেমন বা সমস্ত লাইনকে একটিতে যুক্ত করে কাজ করা উচিত।
— বীরেই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.