উত্তর:
এখানে একটি পসিক্স সমাধান দেওয়া হয়েছে যা বুঝতে খুব সোজা হওয়া উচিত:
find . -type f -exec awk -v x=10 'NR==x{exit 1}' {} \; -exec echo rm -f {} \;
মতই স্টিফেন এর উত্তর , অপসারণ echoকি সরানো হবে যখন খুশি।
বিন্দুটি .বর্তমান ডিরেক্টরিটিকে উপস্থাপন করে। findফাইল এবং ডিরেক্টরিগুলি পুনরাবৃত্তভাবে এর মধ্যে খুঁজে পায় এবং .তাদের সাথে জিনিসগুলি করতে পারে।
-typeএক findএর প্রাইমারিতে ; এটি এমন একটি পরীক্ষা যা প্রতিটি ফাইল এবং ডিরেক্টরি যা পুনরাবৃত্তভাবে পাওয়া যায় (এর মধ্যে .) পাওয়া যায় এবং লাইনে থাকা প্রাইমারিগুলি কেবল তখনই মূল্যায়ন করা হয় যদি এর ফলাফল "সত্য" হয়।
এই বিশেষ ক্ষেত্রে, আমরা কেবল তখনই চালিয়ে যাব যদি আমরা একটি নিয়মিত ফাইলের সাথে কাজ করি , ডিরেক্টরি বা অন্য কোনও কিছু নয় (যেমন একটি ব্লক ডিভাইস))
-execপ্রাথমিক (এর find) একটি বহিস্থিত কমান্ড কল, এবং শুধুমাত্র আগামী প্রাথমিক আয় যদি বহিরাগত কমান্ড প্রস্থানের সফলভাবে ( "0" প্রদর্শন করে প্রস্থান স্থিতি)। {}ফাইলের নাম দ্বারা "বিবেচনা" হচ্ছে প্রতিস্থাপিত হয় findকমান্ড। সুতরাং প্রথম -execকলটি নিম্নোক্ত শেল কমান্ডের সমতুল্য, প্রতিটি ফাইলের পরিবর্তে সম্পাদিত:
awk -v x=10 'NR==x{exit 1}' ./somefilename
আওক নিজের মধ্যে একটি সম্পূর্ণ ভাষা, সিএসভি- র মতো সীমিত পাঠ্য ফাইলগুলি পরিচালনা করার জন্য ডিজাইন করা। আওক শর্তাদি এবং কমান্ডগুলি (যা একক উদ্ধৃতিগুলির মধ্যে থাকে এবং বর্ণগুলি দিয়ে শুরু হয় NR) একটি পাঠ্য ফাইলের প্রতিটি লাইনের জন্য কার্যকর করা হয়। (অন্তর্নিহিত লুপিং।)
আওককে পুরোপুরি শিখতে, আমি গ্রিমোয়ার টিউটোরিয়ালটির জন্য অত্যন্ত সুপারিশ করি তবে আমি উপরের কমান্ডে ব্যবহৃত অ্যাওক বৈশিষ্ট্যগুলি ব্যাখ্যা করব।
-vআওক- এর পতাকাটি আমাদের কাছে ডাব্লু কমান্ডগুলি কার্যকর করার আগে (ফাইলের প্রতিটি লাইনের জন্য) একটি ডব্লু ভেরিয়েবল (একবার) সেট xকরতে দেয় এই ক্ষেত্রে আমরা সেট করেছিলাম 10।
NR" বর্তমান আর ইকর্ডের এন ওম্বার " উল্লেখ করে একটি বিশেষ অ্যাওক ভেরিয়েবল । অন্য কথায়, এটি লুপ নম্বর যা আমরা লুপের মাধ্যমে কোনও নির্দিষ্ট পাসে দেখছি।
(নোট এটি হয় সম্ভব, যদিও অস্বাভাবিক, একটি ভিন্ন "ব্যবহার করতে আর ecord এস , eparator" একটি newline অক্ষর ডিফল্ট চেয়ে সেটিংস এর দ্বারা RS। এখানে রেকর্ড বিভাজক সঙ্গে বাজানো একটি উদাহরণ। )
সচেতনভাবে স্ক্রিপ্টগুলি কন্ডিশনের (কোঁকড়ানো ধনুর্বন্ধনী ধনুধারীর বাইরে) ক্রিয়াকলাপগুলির সাথে মিলিত (কোঁকড়ানো ধনুর্বন্ধনী বক্রবন্ধনী ভিতরে)) যৌগিক শর্ত এবং যৌগিক ক্রিয়াকলাপ থাকতে পারে এবং সেখানে একটি ডিফল্ট শর্ত (সত্য) এবং একটি ডিফল্ট ক্রিয়া (মুদ্রণ) থাকতে পারে তবে আমাদের দরকার নেই তাদের সাথে বিরক্ত করবেন না।
শর্ত এখানে "এই 10th লাইন?" যদি এটি হয় তবে আমরা একটি শূন্য-বহির্গমন স্থিতি নিয়ে বেরিয়ে যাচ্ছি, যার শেল স্ক্রিপ্টিংয়ের অর্থ "ব্যর্থ কমান্ড সমাপ্তি"।
সুতরাং একমাত্র উপায় এই awk কমান্ড থেকে প্রস্থান করা হবে সফলভাবে ফাইলটি শেষ হওয়ার আগে 10 ই লাইন উপনিত উপনিত হয়।
সুতরাং যদি Awk স্ক্রিপ্টটি সফলভাবে প্রস্থান করে, এর অর্থ হল আপনার কাছে দশটি লাইনেরও কম ফাইল রয়েছে।
পরবর্তী -execকল (যদি আপনি এটি সরিয়ে ফেলেন echo) প্রতিটি ফাইল (যা findএর প্রাইমারিগুলির মূল্যায়নের ক্ষেত্রে এতটা বেশি) সরিয়ে ফেলবে :
rm -f ./somefilename
ভবিষ্যদ্বাণীকে findসমর্থন করে এমন একটি বাস্তবায়ন ধরে -readableনিচ্ছেন (যদি আপনি findএটি সমর্থন না করেন, কেবল এটি সরিয়ে দিন, আপনি কেবল পঠনযোগ্য ফাইলের জন্য ত্রুটি বার্তা পাবেন বা এর সাথে প্রতিস্থাপন করবেন -exec test -r {} \;):
x=10 find . -type f -readable -exec sh -c '
for file do
lines=$(wc -l < "$file") && [ "$((lines))" -lt "$x" ] && echo rm -f "$file"
done' sh {} +
echoখুশি হলে অপসারণ ।
এটি বিশেষভাবে দক্ষ নয় কারণ এটি প্রতিটি ফাইলের সমস্ত লাইন গণনা করে যখন এটি কেবলমাত্র এক xতম স্থানে থামতে হবে এবং এটি প্রতিটি ফাইলের জন্য একটি wc(এবং সম্ভাব্য একটি rm) কমান্ড চালায় ।
জিএনইউ দিয়ে awkআপনি এটিকে আরও দক্ষ করে তুলতে পারেন:
x=10
find . -type f -readable -exec awk -v x="$x" -v ORS='\0' '
FNR == x {nextfile}
ENDFILE {if (FNR < x) print FILENAME}' {} +|
xargs -r0 echo rm -f
(আবার, echoখুশি হলে অপসারণ )।
একই সাথে perl:
x=10 find . -type f -readable -exec perl -Tlne '
if ($. == $ENV{x}) {close ARGV}
elsif (eof) {print $ARGV; close ARGV}' {} +
প্রতিস্থাপন printসঙ্গে unlinkসুখী পারেন।
shসেই ইনলাইন স্ক্রিপ্টের মধ্যে যা যায় $0উদাহরণস্বরূপ ত্রুটি বার্তাগুলির জন্য ব্যবহার করা। wc -l "$file"আমরা এখানে চাই না এমন ফাইলের নাম মুদ্রণ করবে এবং ফাইলটি wcখুলতে না পারলেও চলবে । ( ) এ $xরফতানি করা হয় যা এটিকে নিজেই তা দেয় । findx=10 find...sh
find: -readable: unknown primary or operator।
bash। bashএকটি কমান্ড-লাইন দোভাষী, কিন্তু findবাস্তবায়নের। -readableএকটি জিএনইউ এক্সটেনশন, ওএস / এক্স এ উপলব্ধ নয় find। এটি কেবল পঠনযোগ্য ফাইলগুলিতে সীমাবদ্ধ করতে ব্যবহৃত হয় (আপনি পঠনযোগ্য ফাইলের জন্য লাইন গণনা পেতে সক্ষম হবেন না)। আপনি এটি প্রথমটির জন্য বাদ দিতে পারেন, তখন wcপাঠযোগ্য নয় এমন ফাইলগুলির জন্য ফাইলগুলি খোলার সময় আপনি কেবল ত্রুটি বার্তা পাবেন ।
সম্পূর্ণতার স্বার্থে, এডাব্লুকে কে বাদ দিয়ে আপনি একই ফল অর্জনের জন্য জিএনইউ সেডও ব্যবহার করতে পারেন:
find . -type f -exec sed 11q1 '{}' ';' -exec echo rm -f '{}' ';'
যার ফলে কিছুটা আরও সংক্ষিপ্ত কমান্ড লাইনের ফলাফল পাওয়া যায়।
ব্যাখ্যা
11 - is the address, i.e. "the eleventh line"
q - is for _q_uit (abort the execution)
1 - is the exit code parameter for q (GNU sed extension)
shজন্য কি? 2. এরwc -l < "$file"চেয়ে দ্রুতwc -l "$file"? ৩. sh কীভাবে$xকলিং বাশ শেলের সংজ্ঞায়িত, এর মান জানতে পারে ?