ব্যাশে নাল-সীমিত ইনপুটটিতে কীভাবে "মাথা" এবং "লেজ" করবেন?


18

findকমান্ড ফাইলগুলির নাম নাল-সীমাবদ্ধ স্ট্রিং (যদি -print0সরবরাহ করা হয়) হিসাবে আউটপুট করতে পারে এবং বিকল্পটি চালু করে xargsসেগুলি গ্রাস করতে পারে -0। তবে এর মধ্যে, ফাইলগুলির সংগ্রহটি পরিচালনা করা শক্ত - sortকমান্ডের -zসুইচ রয়েছে, যা এই ফাইলগুলি বাছাই করা সম্ভব করে, headএবং tailসেগুলি নেই।

আমি কীভাবে করব headএবং tailসেই নাল-সীমাবদ্ধ ইনপুটগুলিকে সুবিধাজনক উপায়ে করব? (আমি সর্বদা একটি সংক্ষিপ্ত এবং ধীর রুবি স্ক্রিপ্ট তৈরি করতে পারি তবে আমি আশা করি যে আরও ভাল উপায় হতে পারে)

উত্তর:


21

জিএনইউ headএবং tailযেহেতু কোর্টিলস সংস্করণ 8.25 এর -zজন্য বিকল্প রয়েছে।

পুরানো সংস্করণগুলির সাথে বা নন-জিএনইউ সিস্টেমগুলির জন্য, আপনি চেষ্টা করতে এবং অদলবদল করতে পারেন \0এবং \n:

find ... -print0 |
  tr '\0\n' '\n\0' |
  head |
  tr '\0\n' '\n\0'

লক্ষ্য করুন যে কিছু head বাস্তবায়নের NUL অক্ষর সঙ্গে মানিয়ে করতে পারবেন (এবং তারা না POSIX দ্বারা করতে হয়), কিন্তু যেখানে সমর্থন খুঁজে -print0, headএবং টেক্সট ইউটিলিটি সাধারণত NUL অক্ষর সমর্থন করি।

আপনি দুজনের মধ্যে যে কোনও কমান্ড মোড়ানো করতে একটি ফাংশনও ব্যবহার করতে পারেন tr ফর্মের :

nul_terminated() {
  tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}

find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...

মনে রাখবেন যে এর অধীনে nul_terminated, একটি \0অর্থ একটি নতুন লাইনের চরিত্র। সুতরাং উদাহরণস্বরূপ, প্রতিস্থাপন \nসঙ্গে_ :

find . -depth -name $'*\n*' -print0 | nul_terminated sed '
  p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv

( \x0এছাড়াও একটি জিএনইউ এক্সটেনশন হচ্ছে)।

যদি আপনার একাধিক ফিল্টারিং কমান্ড চালানোর প্রয়োজন হয় তবে আপনি এটি করতে পারেন:

find ... -print0 |
  nul_terminated cmd1 |
  nul_terminated cmd2 | xargs -r0 ...

তবে এর অর্থ কয়েকটি অপ্রয়োজনীয় trকমান্ড চালানো। বিকল্পভাবে, আপনি চালাতে পারেন:

find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...

2
মানগুলি সীমিত করার \x0পরিবর্তে ব্যবহারের জন্য এটি কি প্রাথমিক কারণটিকে পরাজিত করে না \n? (¹ যাতে আপনি থাকতে পারে এমন মানগুলির সাথে মানিয়ে নিতে পারেন \n)
থেডওয়ার্ড

@ থ্যাডওয়ার্ড, না, বিপরীতে ফাইল পাথের প্রতিনিধিত্বকারী রেখা-print0 | tr '\n\0' '\0\n' রয়েছে যেখানে তাদের মধ্যে নতুন লাইন অক্ষর রূপান্তরিত হয়েছে । সুতরাং, আপনি যদি প্রথম লাইনটি নিয়ে যান এবং এসটিকে আবার নতুন লাইনে রূপান্তর করেন তবে আপনি প্রথম ফাইলের পাথটি এমএল এমবেড করা নিউলাইন অক্ষরের সাথে নুল-সীমান্তে পেয়েছেন। \0head -n 1\0tr '\0\n' '\n\0'
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.