কমান্ড অপশনগুলিতে ফাইলের পরিবর্তে পাইপ থেকে পড়া ডেটা ব্যবহার করা


18

প্রতি মানুষের সংজ্ঞা হিসাবে, এই কমান্ডটি কোনও ফাইল থেকে ইনপুট পায়।

$ command -r FILENAME

মনে করুন যে এটি FILENAMEএমন একটি ফাইল যা ফাইল ব্যবহারকারীর নামের একটি তালিকা রয়েছে, এটি ব্যবহার করে তৈরি করা হয়েছিল ls > FILENAME

পরিবর্তে আমি কীভাবে lsসরাসরি ফলাফলের সাথে কমান্ডটি ফিড করতে পারি ? আমার মাথায় এরকম কিছু হওয়া উচিত:

$ ls | command -r

কিন্তু এটি হয় না, আউটপুট lsআর্গুমেন্ট হিসাবে আবদ্ধ হয় না। আউটপুট:

Usage: command -r FILENAME
error: -r option requires an argument

আমি কীভাবে পছন্দসই প্রভাব পেতে পারি?


উত্তর:


31

এটি আদেশের উপর নির্ভরশীল। কিছু কমান্ড যা একটি ফাইল থেকে পড়ে তা প্রত্যাশা করে যে ফাইলটি একটি নিয়মিত ফাইল, যার আকার আগেই জানা ছিল এবং যা কোনও অবস্থান থেকে পড়তে পারে এবং পুনরায় সেট করা যায়। যদি ফাইলের বিষয়বস্তুগুলি ফাইলের নামের তালিকা থাকে তবে এটি অসম্ভব: তবে কমান্ডটি সম্ভবত কোনও পাইপযুক্ত বিষয়বস্তুতে থাকবে যা এটি শুরু থেকে শেষ পর্যন্ত ক্রমিকভাবে পড়বে। পাইপের মাধ্যমে ডেটা ফিড করার বিভিন্ন উপায় রয়েছে যাতে কোনও ফাইলের নাম প্রত্যাশা থাকে।

  • অনেক কমান্ড -একটি বিশেষ নাম হিসাবে বিবেচনা করে , যার অর্থ কোনও ফাইল খোলার চেয়ে স্ট্যান্ডার্ড ইনপুট থেকে পড়া । এটি একটি সম্মেলন, কোনও বাধ্যবাধকতা নয়।

    ls | command -r -
  • অনেকগুলি ইউনিক্স রূপগুলি /devস্ট্যান্ডার্ড বর্ণনাকারীদের নির্দিষ্ট করে দেয় এমন বিশেষ ফাইল সরবরাহ করে । যদি /dev/stdinবিদ্যমান থাকে তবে এটি খোলার এবং এটি থেকে পড়া স্ট্যান্ডার্ড ইনপুট থেকে পড়ার সমতুল্য; একইভাবে /dev/fd/0যদি এটি বিদ্যমান।

    ls | command -r /dev/stdin
    ls | command -r /dev/fd/0
  • যদি আপনার শেলটি ksh, বাশ বা zsh হয় তবে আপনি কিছু ফাইল বর্ণনাকারী বরাদ্দের ব্যবসায়ের সাথে শেল ডিল করতে পারেন। এই পদ্ধতির মূল সুবিধাটি হ'ল এটি স্ট্যান্ডার্ড ইনপুটটির সাথে আবদ্ধ নয়, তাই আপনি অন্য কোনও কিছুর জন্য স্ট্যান্ডার্ড ইনপুট ব্যবহার করতে পারেন এবং আপনি এটি একাধিকবার ব্যবহার করতে পারেন।

    command -r <(ls)
  • কমান্ডটি যদি কোনও নির্দিষ্ট ফর্ম (সাধারণত একটি নির্দিষ্ট এক্সটেনশন) প্রত্যাশা করে তবে আপনি এটি প্রতীকী লিঙ্ক দিয়ে বোকা বানানোর চেষ্টা করতে পারেন।

    ln -s /dev/fd/0 list.foo
    ls | command -r list.foo

    অথবা আপনি একটি নামক পাইপ ব্যবহার করতে পারেন।

    mkfifo list.foo
    ls >list.foo &
    command -r list.foo

নোট করুন যে ফাইলগুলির একটি তালিকা তৈরি করা lsসমস্যাযুক্ত কারণ যদি lsফাইলটিতে অক্ষরযুক্ত অক্ষর থাকে তখন মঙ্গলে ফাইলের নাম থাকে। printf '%s\n' *আরও নির্ভরযোগ্য - এটি ফাইলের নামে প্রতিটি বাইট আক্ষরিকভাবে মুদ্রণ করবে। নতুন লাইনের সমন্বিত ফাইলের নামগুলি এখনও সমস্যার কারণ হতে পারে, তবে কমান্ডটি নতুন লাইনের দ্বারা পৃথক পৃথকভাবে ফাইলের নামের একটি তালিকা প্রত্যাশা করে that's


সমস্ত সম্ভাবনা গণনার জন্য +1 আইএমও প্রক্রিয়া প্রতিস্থাপন এই পরিস্থিতির সঠিক উত্তর।
গ্লেন জ্যাকম্যান

7

এটা করা উচিত:

ls | xargs -n 1 command -r

সম্পাদনা করুন: ফাঁকা স্থান সহ নামের জন্য:

ls | xargs -d '\n' -n 1 command -r

এটি সমস্যাযুক্ত হতে পারে যদি commandবিশ্বাস করে যে এটির সমস্ত ফাইলের নাম রয়েছে যা কমান্ড লাইনে একবারে প্রয়োজন হবে need Xargs এর কিছু সংস্করণ একবারে commandকয়েকটি ফাইলের নাম দেবে (10, এটি আমার কাছে মনে হয়)। দেখে মনে হচ্ছে জিএনইউ xargs সমস্ত কিছু একবারে দেয়।
ব্রুস এডিগার

2

প্রকৃতপক্ষে, আমি যে একমাত্র নির্ভরযোগ্য সমাধানটি জানি তার মধ্যে একটি নতুনলাইনযুক্ত সমস্ত ফাইল নামই হ্যান্ডেল করতে পারে:

find . -maxdepth 1 -print0 | xargs -n 1 -0 command -r

এক্ষেত্রে ফাইলনামে কেবলমাত্র অনুমোদিত নয় এমন অক্ষর হ'ল নাল অক্ষর, যা কোনওভাবেই ফাইল নামগুলিতে অনুমোদিত নয়।


1

অনেক কমান্ড -একটি "ফাইলের নাম" হিসাবে গ্রহণ করে যার অর্থ "স্ট্যান্ডার্ড ইনপুট ব্যবহার করুন", তবে এই সম্মেলনটি সর্বজনীন থেকে অনেক দূরে। ম্যান পৃষ্ঠাটি পড়ুন।


1

এটি আপনার উদ্দেশ্যে কাজ করা উচিত: ls | command -r /dev/stdin

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