সমস্ত ফাইল দেখতে বিড়ালের কমান্ড দ্বারা ফাইলগুলির তালিকা কীভাবে ফিরে আসে list


204

আমি একটি করছি findএবং তারপরে ফাইলগুলির একটি তালিকা পাচ্ছি । আমি কীভাবে এটিকে অন্য কোনও ইউটিলিটিতে পাইপ করব cat(যাতে বিড়াল those সমস্ত ফাইলের বিষয়বস্তু প্রদর্শন করে) এবং মূলত grepএই ফাইলগুলি থেকে কোনও কিছুর প্রয়োজন হয় ।

উত্তর:


340
  1. অন্য প্রক্রিয়াতে পাইপিং করা (যদিও আপনি যা বলেছিলেন সেটি করার চেষ্টাটি এটি সফল করবে না):

    command1 | command2
    

    এটি কমান্ড 2 এর ইনপুট হিসাবে কমান্ড 1 এর আউটপুট প্রেরণ করবে

  2. -execউপর একটি find(এটি আপনি যা করতে চান তা করবে - তবে এটি নির্দিষ্ট find)

    find . -name '*.foo' -exec cat {} \;
    

    (এর মধ্যে findএবং -execএর মধ্যবর্তী সবকিছুই পূর্বাভাস দেয় আপনি ইতিমধ্যে ব্যবহার করছেন। {}আপনি যে বিশেষ ফাইলটি কমান্ডের মধ্যে খুঁজে পেয়েছেন তা প্রতিস্থাপন করবে ( cat {}এই ক্ষেত্রে); কমান্ডটি \;শেষ করা হবে is -exec)

  3. কমান্ড লাইন আর্গুমেন্ট হিসাবে অন্য প্রক্রিয়াতে একটি প্রক্রিয়ার আউটপুট প্রেরণ করুন

    command2 `command1`
    

    উদাহরণ স্বরূপ:

    cat `find . -name '*.foo' -print`
    

    (উল্লেখ্য এই ব্যাক-উদ্ধৃতি নিয়মিত কোট (আমার কীবোর্ডে টিল্ড ~ অধীনে) হয়।) এই আউটপুট পাঠাব command1মধ্যে command2কমান্ড লাইন আর্গুমেন্ট হিসাবে। নোট করুন যে স্পেস (নিউলাইনস, ইত্যাদি) সম্বলিত ফাইলের নামগুলি পৃথক যুক্তিতে বিভক্ত হবে।


2
বিড়াল find -name '*.foo' -printআমার জন্য দুর্দান্ত কাজ করেছে ... ধন্যবাদ
দেবাং কামদার

ব্যাককোটগুলি দুর্দান্ত কাজ করে এবং আরও সাধারণীকরণ করা হয়, আপনি এটি ফাইল থেকে ফাইলগুলির একটি তালিকা তৈরি করতেও ব্যবহার করতে পারেন।
হাজোক

11
নোট করুন যে আধুনিক সংস্করণগুলি findআপনাকে লেখার অনুমতি দেয়: find . -name '*.foo' -exec cat {} +যেখানে এটি +নির্দেশ করে যে findএকক কমান্ডের অনুরোধে যতগুলি ফাইলের নাম যথাযথভাবে গ্রুপ করা উচিত। এটি পুরোপুরি দরকারী (এটা অবলম্বন না ফাইলের নাম মধ্যে শূণ্যস্থান ইত্যাদি সঙ্গে পুলিশ -print0এবং xargs -0)।
জোনাথন লেফলার

18
নিরক্ষিত:find . -name '*.foo' | xargs cat
স্টিউসওয়ার্ড

3
কেবল @ স্টিওস্কয়ার্ডের উত্তরটি যুক্ত করতে: একটি নির্দিষ্ট স্ট্রিংযুক্ত ফাইলগুলিতে সমস্ত লাইন সন্ধান করতে, করুনfind . -name '*.foo' | xargs cat | grep string
বিম

84

আধুনিক সংস্করণ

POSIX 2008 +চিহ্নিতকারীকে যুক্ত করেছে findযার অর্থ এটি এখন স্বয়ংক্রিয়ভাবে একটি ফাইলকে একক কমান্ড প্রয়োগের জন্য যুক্তিসঙ্গত হিসাবে অনেকগুলি গ্রুপ xargsকরে, অনেকটা পছন্দ করে, তবে বেশ কয়েকটি সুবিধা সহ:

  1. ফাইলের নামগুলিতে আপনাকে বিজোড় চরিত্রগুলি নিয়ে চিন্তা করতে হবে না।
  2. শূন্য ফাইলের নাম সহ কমান্ডটি চাওয়ার বিষয়ে আপনাকে চিন্তা করতে হবে না।

ফাইলের নাম সমস্যার সাথে একটি সমস্যা xargsছাড়া -0বিকল্প, এবং ইস্যু 'এমনকি শূন্য ফাইলের নাম দিয়ে চালানো' সহ বা ছাড়া একটি সমস্যা -0বিকল্প - কিন্তু গনুহ xargsহয়েছে -rবা --no-run-if-emptyযে ঘটনাকেই প্রতিরোধ করার অপশন। এছাড়াও, এই নোটেশনটি প্রক্রিয়াগুলির সংখ্যাকে হ্রাস করে, আপনি পারফরম্যান্সের পার্থক্যটি পরিমাপ করার সম্ভাবনা নেই। সুতরাং, আপনি সংবেদনশীলভাবে লিখতে পারেন:

find . -exec grep something {} +

ক্লাসিক সংস্করণ

find . -print | xargs grep something

আপনি লিনাক্স গেছেন অথবা গনুহ থাকে findএবং xargsকমান্ড, তারপর ব্যবহার -print0সঙ্গে findএবং -0সঙ্গে xargsহ্যান্ডেল ফাইল স্পেস এবং অন্যান্য বিজোড় বল অক্ষর ধারণকারী নামের।

find . -print0 | xargs -0 grep something

থেকে ফলাফল টুইট grep

আপনি যদি ফাইলের নামগুলি না চান (কেবলমাত্র পাঠ্য) তবে একটি উপযুক্ত বিকল্প যুক্ত করুন grep(সাধারণত -h'শিরোনামগুলি দমন করতে')। একেবারে গ্যারান্টি ফাইল নামে ছাপা হয় grep(এমনকি যদি শুধুমাত্র একটি ফাইল পাওয়া যায় নাই কিংবা শেষ আবাহন grepমাত্র 1 ফাইলের নাম দেওয়া হয়), তারপর যোগ /dev/nullকরার xargsকমান্ড লাইন, যাতে সবসময় অন্তত দুই ফাইলের নাম হতে হবে।


আমার মতো বিভ্রান্তদের জন্য, মনে রাখবেন যে এই পদ্ধতিতে প্রথমে সমস্ত ফলাফল খুঁজে পাওয়া যাবে এবং তারপরে আউটপুট দেবে xargs grep something
এরিক হু

3
@ এরিকহু: আমি দেখতে পাচ্ছি যে আপনি বিভ্রান্ত হয়ে পড়েছেন, তবে এটি আপনি যা বলছেন তা করে না, কমপক্ষে আমি যে ইউনিক্স-ভিত্তিক জানি সে সম্পর্কে নয়। এর আউটপুটটি findস্ট্যান্ডার্ড ইনপুটটিতে পাইপ করা হয় xargsxargsপ্রোগ্রাম তার মান ইনপুট সার্চ, সাদা স্থান এ ইনপুট বিভাজন (ঐ খালি, নতুন লাইন, ট্যাব, ইত্যাদি) এবং কমান্ড শব্দের একটি সংখ্যা appends grep somethingএবং কমান্ড লাইন সঞ্চালন করে। xargsতারপরে ইনপুটটি শেষ না হওয়া অবধি ইনপুট পড়া এবং চালানো কমান্ডগুলি চালিয়ে যায়। প্রদত্ত ইনপুটটির জন্য যতবার প্রয়োজন ততবার কমান্ড xargsচালায় grep( findএই উদাহরণ থেকে)।
জোনাথন লেফলার

আহ আমার ভুল, এটি মিলছে প্রতিটি ফাইলের মধ্যে অনুসন্ধানের জন্য গ্রেপ ব্যবহার করছে। আমি কেবল গ্রেপ
এরিক হু

1
ত্রুটিগুলি সমস্ত ভাল আচরণ করা কমান্ডগুলিতে স্ট্যান্ডার্ড ত্রুটি (ফাইল বর্ণনাকারী 2) এ যায়। স্টার্ডারকে /dev/nullত্রুটি বার্তা হারাতে পুনঃনির্দেশ করা হচ্ছে ।
জোনাথন লেফলার

1
এটির উপকারিতা এটি ফাইল পথে ফাঁকা স্থানগুলির সাথে আরও ভাল কাজ করে। এমনকি 'সেডিং' "->" \ "এটিকে` এর সাথে ভেঙে দেয় তবে xargs দিয়ে এটি পুরোপুরি কাজ করে
JZL003

36

findকমান্ড দ্বারা ফিরিয়ে দেওয়া ফাইলগুলির তালিকা কমান্ডের কাছে পাঠানোর কয়েকটি উপায় রয়েছে cat, যদিও প্রযুক্তিগতভাবে সমস্ত পাইপ ব্যবহার করে না, এবং আসলে কোনও পাইপই সরাসরি ব্যবহার করে না cat

  1. ব্যাকটিক্স ( `) ব্যবহার করা সহজ :

    cat `find [whatever]`
    

    এটি আউটপুট নেয় findএবং কার্যকরভাবে এটির কমান্ড লাইনে রাখে catfindখুব বেশি আউটপুট (কমান্ড-লাইনে ফিট করার চেয়ে বেশি) বা আউটপুটে বিশেষ অক্ষর (স্পেসের মতো) থাকলে এটি ভাল কাজ করে না ।

  2. কয়েকটি শেল সহ bash, $()ব্যাকটিকগুলির পরিবর্তে কেউ ব্যবহার করতে পারেন :

    cat $(find [whatever])
    

    এটি কম পোর্টেবল, তবে বাসা বাঁধে। এটি বাদ দিয়ে, এতে ব্যাকটিক্সের মতো একইরকম ক্যাভ্যাট রয়েছে।

  3. যেটি পাওয়া গেছে তার উপরে অন্যান্য কমান্ড চালানো একটি সাধারণ ব্যবহার find, এটি সন্ধান করে এমন একটি -execক্রিয়া রয়েছে যা প্রতিটি ফাইলের জন্য এটি একটি আদেশ প্রয়োগ করে:

    find [whatever] -exec cat {} \;
    

    {}এটি ফাইলের নামের জন্য একটি স্থানধারক এবং \;কমান্ডের শেষ চিহ্ন চিহ্নিত করে (এর পরে অন্যান্য ক্রিয়াও করা সম্ভব -exec))

    এটি একাধিক ফাইলের নাম পাস করার catএকক দৃষ্টান্ত চালানোর পরিবর্তে প্রতিটি একক ফাইলের জন্য একবার চলবে catযা অযোগ্য হতে পারে এবং কিছু আদেশের জন্য আপনার পছন্দসই আচরণ নাও করতে পারে (যদিও এটি ভাল cat)। সিনট্যাক্সটি টাইপ করার জন্যও একটি বিশ্রী - আপনার সেমিকোলনটি এড়াতে হবে কারণ সেমিকোলন শেলের জন্য বিশেষ is

  4. কয়েকটি সংস্করণ find(সবচেয়ে উল্লেখযোগ্যভাবে জিএনইউ সংস্করণ) আপনাকে এর কম সংখ্যক দৃষ্টান্ত চালানোর জন্য অ্যাপেনড মোড ব্যবহার করে প্রতিস্থাপন ;করতে +দেয় :-execcat

    find [whatever] -exec cat {} +
    

    এটি প্রতিটি অনুরোধে একাধিক ফাইলের নাম পাস করবে cat, যা আরও কার্যকর হতে পারে।

    মনে রাখবেন যে তবে এটি একটি একক অনুরোধ ব্যবহারের গ্যারান্টিযুক্ত নয় । কমান্ড লাইনটি যদি দীর্ঘ হয় তবে আর্গুমেন্টগুলি একাধিক অনুরোধে ছড়িয়ে পড়ে cat। জন্য catএটি সম্ভবত একটি বড় চুক্তি হয় না, কিন্তু অন্য কিছু কমান্ড এই অবাঞ্ছিত উপায়ে আচরণ পরিবর্তন হতে পারে। লিনাক্স সিস্টেমে কমান্ড লাইনের দৈর্ঘ্য সীমাটি বেশ বড়, তাই অন্য কয়েকটি ওএসের তুলনায় একাধিক প্রার্থনায় বিভক্ত হওয়া খুব বিরল।

  5. ক্লাসিক / বহনযোগ্য পন্থাটি ব্যবহার করা হল xargs:

    find [whatever] | xargs cat
    

    xargsসুনির্দিষ্ট কমান্ডটি চালায় ( catএই ক্ষেত্রে), এবং স্ট্ডিনের কাছ থেকে এটি কী পড়বে তার ভিত্তিতে যুক্তি যুক্ত করে। শুধু -execসঙ্গে +, এই পর্যন্ত কম্যান্ড-লাইন প্রয়োজনে ভঙ্গ করবে। এটি যদি findখুব বেশি আউটপুট উত্পাদন করে তবে এটি catএকাধিকবার চলবে । আগে যেমন বিভাগে উল্লেখ করা হয়েছে -exec, কিছু আদেশ রয়েছে যেখানে এই বিভাজনের ফলে বিভিন্ন আচরণ হতে পারে in নোট করুন যে এর xargsমতো ব্যবহারের ক্ষেত্রে ফাইলনামে ফাঁকা জায়গাগুলির সমস্যা রয়েছে xargsঠিক যেমন একটি ডিলিমিটার হিসাবে শ্বেত স্পেস ব্যবহার করে।

  6. সর্বাধিক শক্তিশালী, বহনযোগ্য এবং দক্ষ পদ্ধতিটিও ব্যবহার করে xargs:

    find [whatever] -print0 | xargs -0 cat
    

    -print0পতাকা বলে findব্যবহার করতে \0(নাল চরিত্র) বিভেদক ফাইলের নামের মধ্যে, এবং -0পতাকা বলে xargsএই আশা \0বিভেদক। এটি আরও কার্যকরভাবে বহনযোগ্য (তবে দুর্ভাগ্যক্রমে আরও ভার্বোস) হলেও -exec... +পদ্ধতির সাথে প্রায় একই ধরণের আচরণ রয়েছে ।


ব্যাকটিক পদ্ধতিটি দুর্দান্ত, কারণ এটি অন্যান্য কমান্ডের মতোও কাজ lsকরে।
মার্টিন ব্রাউন

@ মার্টিন ব্রাউন ব্যবহার $()করে অন্য কমান্ডগুলির সাথেও কাজ করে find
লরেন্স গনসাল্ভেস

ধন্যবাদ, জেনে রাখা ভাল, আমি কিন্ডা (1) এর পরে পড়া বন্ধ করে দিয়েছি, কারণ এটি আমার চাহিদা পূরণ করে, যেহেতু আমি স্পেস এবং এর মতো বিশেষ চরিত্রগুলি নিয়ে কাজ করছি না।
মার্টিন ব্রাউন

9

এটি অর্জনের জন্য (ব্যাশ ব্যবহার করে) আমি নিম্নলিখিত হিসাবে করব:

cat $(find . -name '*.foo')

এটি "কমান্ড সাবস্টিটিউশন" হিসাবে পরিচিত এবং এটি ডিফল্টরূপে লাইন ফিডটি সরিয়ে দেয় যা সত্যই নিশ্চিত!

আরও infos এখানে


6

আমার কাছে শেল স্ক্রিপ্টের জন্য একটি কাজের মতো শোনাচ্ছে:

for file in 'find -name *.xml'
do
   grep 'hello' file
done

বা এই জাতীয় কিছু


2
এটি একটি বৈধ, যদিও প্রয়োজনীয় সর্বোত্তম নয়, প্রশ্নের উত্তর।
জোনাথন লেফলার

1
... হ্যাঁ তবে আপনি যদি তালিকাভুক্ত ফাইলের নাম সহ একটি বড় ফাইল চান তবে এটি দুর্দান্ত।
ʍǝɥʇɐɯ

1
আমি এটি সেরা পছন্দ। এই কাজের মতো একটি লুপ ব্লক অন্যান্য জিনিসগুলি করার জন্য room
কাকিয়ো 20'14

4

আমি আগ্রহী এমন কিছু বিষয়বস্তুযুক্ত ফাইলের নাম সন্ধানের জন্য আমার উপায়, কেবলমাত্র একটি একক ব্যাশ লাইন যা ফাইল নামগুলিতে খুব সুন্দরভাবে স্থানগুলি পরিচালনা করে:

find . -name \*.xml | while read i; do grep '<?xml' "$i" >/dev/null; [ $? == 0 ] && echo $i; done

3

আমি এই জাতীয় কিছু ব্যবহার:

find . -name <filename> -print0 | xargs -0 cat | grep <word2search4>

" পাথ" এর জন্য -print0" -0" আর্গুমেন্ট এবং "xargs" এর জন্য "আর্গুমেন্ট সঠিকভাবে ফাইল পাথ / নামগুলিতে শ্বেত স্পেস পরিচালনা করতে হবে।


2

ফাইন্ড কমান্ডের একটি স্বতন্ত্র যুক্তি রয়েছে যা আপনি এই জাতীয় জিনিসের জন্য ব্যবহার করতে পারেন, আপনি সরাসরি এটি ব্যবহার করে গ্রেপ করতে পারেন।

উদাহরণস্বরূপ ( এখান থেকে, এই পৃষ্ঠায় অন্যান্য ভাল উদাহরণ ):

find . -exec grep "www.athabasca" '{}' \; -print 

2

এখানে সাধারণ ব্যবহারের জন্য আমার শট দেওয়া হয়েছে:

grep YOURSTRING `find .`

এটি ফাইলের নাম মুদ্রণ করবে


2

ব্যাশে, নিম্নলিখিতটি উপযুক্ত হবে:

find /dir -type f -print0 | xargs -0i cat {} | grep whatever

এটি /dirডিরেক্টরিতে সমস্ত ফাইল সন্ধান করবে এবং ফাইলের নামগুলি নিরাপদে পাইপ xargsকরবে যা নিরাপদে ড্রাইভ করবেgrep

xargsআপনার যদি হাজার হাজার ফাইল থাকে তবে এড়িয়ে যাওয়া কোনও ভাল ধারণা নয় /dir; catঅতিরিক্ত যুক্তির তালিকার দৈর্ঘ্যের কারণে ভেঙে যাবে।xargsআপনার জন্য যে সব সাজান।

-print0আর্গুমেন্ট প্রাপ্ত করতে findসঙ্গে জালের ফাঁস -0যুক্তি xargsব্যবধান সহ ফাইলের নামের সঠিকভাবে পরিচালনা করতে। -iআর্গুমেন্ট প্রাপ্ত করতে xargsআপনি ফাইলের নাম যেখানে প্রয়োজন সন্নিবেশ করতে পারেন catকমান্ড লাইন। বন্ধনীগুলি ফাইলের নাম catথেকে কমান্ডটিতে পাইপ করা হয়েছে find



0

Ggrep ব্যবহার করুন ।

ggrep -H -R -I "mysearchstring" *

বর্তমান ডিরেক্টরি বা একটি উপ ডিরেক্টরিতে অবস্থিত পাঠ্যগুলি সহ ইউনিক্সে ফাইল অনুসন্ধান করতে search


0

এটি কেবল ফাইলগুলির নাম এবং বিষয়বস্তু কেবল পুনরাবৃত্তভাবে মুদ্রণ করবে ..

find . -type f -printf '\n\n%p:\n' -exec cat {} \;

সম্পাদনা (উন্নত সংস্করণ): এটি কেবল পাঠ্য নামগুলির (পাঠানো) নাম এবং লিখিত সামগ্রী মুদ্রণ করবে কেবল পুনরাবৃত্তভাবে ..

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

আরও একটি চেষ্টা

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;

-1

আপনি কি ফাইলগুলিতে পাঠ্য সন্ধান করার চেষ্টা করছেন? আপনি কেবল তার জন্য গ্রেপ ব্যবহার করতে পারেন ...

grep searchterm *

-1

ডিরেক্টরি / ghi এবং / jkl এ একটি সার্ভারে সমস্ত abc.def ফাইলের সামগ্রী তালিকাভুক্ত করতে এবং দেখতে

find /ghi /jkl -type f -name abc.def 2> /dev/null -exec ls {} \; -exec cat {} \;

Abc.def ফাইলগুলিতে তালিকাভুক্ত করতে যেগুলি এন্ট্রি মন্তব্য করেছে এবং ডিরেক্টরিগুলি / ghi এবং / jkl এ সেগুলি দেখুন

find /ghi /jkl -type f -name abc.def 2> /dev/null -exec grep -H ^# {} \;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.