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


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.