একাধিক ফাইলকে সংঘবদ্ধ করুন তবে বিভাগের শিরোনাম হিসাবে ফাইলের নাম অন্তর্ভুক্ত করুন


352

আমি টার্মিনালের একটি বড় ফাইলে অনেকগুলি পাঠ্য ফাইলকে সংযুক্ত করতে চাই। আমি জানি আমি ক্যাট কমান্ড ব্যবহার করে এটি করতে পারি। তবে, আমি প্রতিটি ফাইলের ফাইলের নামটি সেই ফাইলটির জন্য "ডেটা ডাম্প" এর আগে রাখতে চাই। কেউ কি করতে পারে জানেন?

আমার বর্তমানে যা আছে:

file1.txt = bluemoongoodbeer

file2.txt = awesomepossum

file3.txt = hownowbrowncow

cat file1.txt file2.txt file3.txt

কাঙ্ক্ষিত আউটপুট:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow

আমি আসলে ইউনকোড এবং ইউডিকোড ব্যবহার করছি অনুরূপ কিছু করার জন্য, আমার অভ্যন্তরীনভাবে পঠনযোগ্য ফাইলের দরকার নেই, কেবল ফলাফলের প্রয়োজন এবং সেগুলি আবার অন্য কমান্ডে পাইপ করুন

উত্তর:


531

একই জিনিসটি সন্ধান করছিল এবং এটির পরামর্শ দেওয়ার জন্য এটি খুঁজে পেল:

tail -n +1 file1.txt file2.txt file3.txt

আউটপুট:

==> file1.txt <==
<contents of file1.txt>

==> file2.txt <==
<contents of file2.txt>

==> file3.txt <==
<contents of file3.txt>

যদি কেবল একটি একক ফাইল থাকে তবে শিরোনামটি মুদ্রিত হবে না। জিএনইউ ব্যবহারগুলি ব্যবহার করে, -vআপনি সর্বদা একটি শিরোনাম মুদ্রণ করতে ব্যবহার করতে পারেন ।


2
এটি জিএনইউ লেজের সাথেও কাজ করে (জিএনইউ কোরিটিলসের অংশ)।
অর্জুনশঙ্কর

7
দুর্দান্ত -n +1বিকল্প! একটি বিকল্প: head -n-0 file1 file2 file3
হিমশীতল শিখা

2
ওয়ার্কস উভয় বাসদ লেজ এবং MacOS এর এক্স আপনি গনুহ লেজ সাথে সুন্দরভাবে মধ্যে স্থান আউট চলে যাবে -nএবং +1হিসাবে, -n+1
ভিডিএম

4
tail -n +1 *আমি ঠিক খুঁজছিলাম ছিল, ধন্যবাদ!
kR105

1
ম্যাকওএসএক্স 10.14.4sudo ulimit -n 1024; find -f . -name "*.rb" | xargs tail -n+1 > ./source_ruby.txt
কোলাস

186

আমি অনুরূপ কিছু জন্য গ্রেপ ব্যবহার:

grep "" *.txt

এটি আপনাকে একটি 'শিরোলেখ' দেয় না, তবে ফাইলের নামের সাথে প্রতিটি লাইনে উপসর্গ দেয়।


10
*.txtশুধুমাত্র একটি ফাইলে প্রসারিত হলে আউটপুট বিরতি । এই বিষয়ে, আমি পরামর্শ দেবgrep '' /dev/null *.txt
এন্টাক

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

9
grepযদি একাধিক ফাইল থাকে তবে কেবল ফাইল শিরোনামগুলি মুদ্রণ করবে। আপনি যদি সর্বদা ফাইলের পাথ মুদ্রণ করতে নিশ্চিত করতে চান তবে ব্যবহার করুন -H। আপনি যদি না চান তবে শিরোনামগুলি ব্যবহার করুন -h। এছাড়াও এটি নোট করুন এটি (standard input)STDIN এর জন্য মুদ্রণ করবে ।
জর্জে বুকারান

1
আপনি ag(সিলভার সন্ধানকারী ) ও ব্যবহার করতে পারেন : ডিফল্টরূপে ag . *.txtপ্রতিটি ফাইলের নাম এবং প্রতিটি লাইন তার সংখ্যার সাথে উপস্থাপন করে।
এনোল

1
দ্রষ্টব্য, -nগ্রেপ এ যাওয়ার সাথে সাথে লাইন সংখ্যাও পাওয়া যায় যা আপনাকে পিনপয়েন্টিং সহ সাধারণ লিটারার লিখতে দেয় যা উদাহরণস্বরূপ, ইম্যাক্স দ্বারা বাছাই করতে পারে।
ডিপ্রেশনডানিয়েল

104

এটি কৌশলটিও করা উচিত:

find . -type f -print -exec cat {} \;

মাধ্যম:

find    = linux `find` command finds filenames, see `man find` for more info
.       = in current directory
-type f = only files, not directories
-print  = show found file
-exec   = additionally execute another linux command
cat     = linux `cat` command, see `man cat`, displays file contents
{}      = placeholder for the currently found filename
\;      = tell `find` command that it ends now here

আপনি এরপরে অনুসন্ধানের গর্ত বুলিয়ান অপারেটরগুলিকে -andবা একত্রিত করতে পারেন -orfind -lsখুব সুন্দর।


1
এই আদেশটি কী করে আপনি আরও ব্যাখ্যা করতে পারেন? আমার ঠিক
যেমনটি

4
এটি লিনাক্সের স্ট্যান্ডার্ড ফাইন্ড কমান্ড। এটি বর্তমান ডিরেক্টরিতে সমস্ত ফাইল সন্ধান করে, তাদের নাম মুদ্রণ করে, তারপরে প্রত্যেকের জন্য, ফাইলটি বিড়াল করে। ছাড়াই -printফাইলের নাম আগে প্রিন্ট করবে না cat
ম্যাক্সিম_অনাইটেড

17
আপনি -printfআউটপুট কাস্টমাইজ করতে ব্যবহার করতে পারেন । উদাহরণস্বরূপ: find *.conf -type f -printf '\n==> %p <==\n' -exec cat {} \;আউটপুট মেলেtail -n +1 *
Maxim_united

1
-প্রিন্টফ ম্যাকের উপর কাজ করে না, যদি না আপনি চান brew install findutilsএবং তার gfindপরিবর্তে ব্যবহার করুন find
ম্যাট ফ্লেচার 11

1
আপনি যদি রং চান তবে আপনি সেই সত্যটি ব্যবহার করতে পারেন যা findএকাধিক -execগুলিকে মঞ্জুরি দেয় :find -name '*.conf' -exec printf '\n\e[33;1m%s\e[0m\n' {} \; -exec cat {} \;
ব্যানব

24

এই কৌতুক করতে হবে:

for filename in file1.txt file2.txt file3.txt; do
    echo "$filename"
    cat "$filename"
done > output.txt

বা সমস্ত পাঠ্য ফাইলের জন্য এটি পুনরাবৃত্তভাবে করতে:

find . -type f -name '*.txt' -print | while read filename; do
    echo "$filename"
    cat "$filename"
done > output.txt

1
কাজ হয়নি। আমি কিছু সত্যই কুৎসিত অ্যাডক কোড লিখেছি: আমি $ listoffiles এ awk 'F জন্য ফাইল ফাইল, $ 0, $ 1, $ 2, $ 3, $ 4, $ 5, $ 6, $ 7, $ 8, $ 9, $ 10, $ 11}' $ i >> concat.txt সম্পন্ন হয়েছে
নিক

2
...বিশদ যত্ন? এটি ব্যাশ কোডের মতোই সহজ।
ক্রিস ইবারেল

@ নিক: আপনার পুরোপুরি লাইনটি বিবেচনা করে আপনার খালি লাইনটিও কাজ করা উচিত নয় $0, সুতরাং আপনি আসলে সেখানে কলামগুলি পুনরাবৃত্তি করতে পেরেছেন ...
ক্রিস এবারেল

@ নিক: নিফ্টির সমাধান অন্যথায় :)
ক্রিস ইবারল

@ ক্রিস: হ্যাঁ, তবে এটি হওয়া আমার চেয়ে অনেক খারাপ। আপনার কোডটি আমার জন্য কাজ করছে না কারণ আমি স্ট্যাডআউট ধরতে >> ব্যবহার করছি?
নিক

17

আমার কাছে এমন একটি সিরিজের ফাইল ছিল যা stats.txt এ শেষ হয়েছিল যা আমি ফাইলের নামগুলির সাথে সম্মতি জানাতে চাই।

আমি নিম্নলিখিতটি করেছিলাম এবং যখন একাধিক ফাইল থাকে তখন "মোর" কমান্ডের মধ্যে শিরোনাম হিসাবে ফাইলের নাম অন্তর্ভুক্ত থাকে।

more *stats.txt > stats.txt

বা একটি সাধারণ ক্ষেত্রে

more FILES_TO_CONCAT > OUTPUT_FILE

5
more <FILES> | cat
একিউম্যানাস

15
find . -type f -print0 | xargs -0 -I % sh -c 'echo %; cat %'

এটি পুরো ফাইলের নাম (পথ সহ) মুদ্রণ করবে, তারপরে ফাইলের বিষয়বস্তু। এটি খুব নমনীয়, কারণ আপনি ফাইন্ড কমান্ডের জন্য "expr" নাম ব্যবহার করতে পারেন এবং ফাইলগুলিতে আপনার পছন্দ মতো কম্যান্ড চালাতে পারেন।


1
এটি একত্রিত করা বেশ সোজাও grep। এর সাথে ব্যবহার করতে bash:find . -type f -print | grep PATTERN | xargs -n 1 -I {} -i bash -c 'echo ==== {} ====; cat {}; echo'
dojuba

5

আমি এই বিকল্পটি পছন্দ করি

for x in $(ls ./*.php); do echo $x; cat $x | grep -i 'menuItem'; done

আউটপুট এর মতো দেখাচ্ছে:

./debug-things.php
./Facebook.Pixel.Code.php
./footer.trusted.seller.items.php
./GoogleAnalytics.php
./JivositeCode.php
./Live-Messenger.php
./mPopex.php
./NOTIFICATIONS-box.php
./reviewPopUp_Frame.php
            $('#top-nav-scroller-pos-<?=$active**MenuItem**;?>').addClass('active');
            gotTo**MenuItem**();
./Reviews-Frames-PopUps.php
./social.media.login.btns.php
./social-side-bar.php
./staticWalletsAlerst.php
./tmp-fix.php
./top-nav-scroller.php
$active**MenuItem** = '0';
        $active**MenuItem** = '1';
        $active**MenuItem** = '2';
        $active**MenuItem** = '3';
./Waiting-Overlay.php
./Yandex.Metrika.php

4

আমি সাধারণত এইভাবে ফর্ম্যাটিংটি পরিচালনা করি:

for i in *; do echo "$i"; echo ; cat "$i"; echo ; done ;

আমি সাধারণত নির্দিষ্ট তথ্যের জন্য বিড়ালটিকে গ্রেপের মধ্যে পাইপ করি।


3
এখানে সাবধান। for i in *উপ-ডিরেক্টরি অন্তর্ভুক্ত করবে না।
একিউম্যানাস

4

এবং অনুপস্থিত অজানা সমাধানটি হ'ল:

$ awk '(FNR==1){print ">> " FILENAME " <<"}1' *

আপনার দুর্দান্ত উত্তরের জন্য ধন্যবাদ। আপনি কি 1অভিব্যক্তিটির শেষে অর্থটি ব্যাখ্যা করতে পারেন ?
bwangel

1
ধন্যবাদ।
Awk

3

আপনি লুপের জন্য ব্যবহার না করে এই সাধারণ কমান্ডটি ব্যবহার করতে পারেন,

ls -ltr | awk '{print $9}' | xargs head

3

আপনি যদি রঙ পছন্দ করেন তবে এটি ব্যবহার করে দেখুন:

for i in *; do echo; echo $'\e[33;1m'$i$'\e[0m'; cat $i; done | less -R

বা:

tail -n +1 * | grep -e $ -e '==.*'

বা: (প্যাকেজ 'মাল্টিটেল' ইনস্টল সহ)

multitail *

1
রঙের ফাইলের নাম হাইলাইট করার জন্য:find . -type f -name "*.txt" | xargs -I {} bash -c "echo $'\e[33;1m'{}$'\e[0m';cat {}"
মিডিয়াভিস

3

যদি ফাইলগুলির সকলের একই নাম থাকে বা এর সাথে মিলে যায় তবে findআপনি (উদাহরণস্বরূপ) করতে পারেন:

find . -name create.sh | xargs tail -n +1

প্রতিটি ফাইলের সন্ধান এবং সন্ধান করতে।


2

এখানে একটি সত্যিই সহজ উপায়। আপনি বলেছিলেন যে আপনি বিড়াল চান, যা বোঝায় আপনি পুরো ফাইলটি দেখতে চান। তবে আপনার ফাইলের নামও প্রিন্ট করা দরকার।

এটা চেষ্টা কর

head -n99999999 * অথবা head -n99999999 file1.txt file2.txt file3.txt

আশা করি এইটি কাজ করবে


4
একটি ক্লিনার সিনট্যাক্স হবে head -n -0 file.txt file2.txt file3.txtheadজিএনইউ
কোর্টিলগুলিতে

1

এই পদ্ধতিটি ফাইলের নাম এবং তারপরে ফাইলের সামগ্রী মুদ্রণ করবে:

tail -f file1.txt file2.txt

আউটপুট:

==> file1.txt <==
contents of file1.txt ...
contents of file1.txt ...

==> file2.txt <==
contents of file2.txt ...
contents of file2.txt ...

3
-fআপনি একটি ফাইল যা লেখা হচ্ছে ট্র্যাক করতে চান, কিন্তু সত্যিই কি ওপি জিজ্ঞাসা সুযোগ মধ্যে দরকারী।
ট্রিপলি

1

আপনি যদি এই কুরুচিপূর্ণ ==> <== অন্য কিছু দিয়ে প্রতিস্থাপন করতে চান

tail -n +1 *.txt | sed -e 's/==>/\n###/g' -e 's/<==/###/g' >> "files.txt"

ব্যাখ্যা:

tail -n +1 *.txt - হেডার সহ ফোল্ডারে সমস্ত ফাইল আউটপুট

sed -e 's/==>/\n###/g' -e 's/<==/###/g'- প্রতিস্থাপন ==>সঙ্গে নতুন লাইন + + ### এবং <==মাত্র সঙ্গে ###

>> "files.txt" - সমস্ত একটি ফাইল আউটপুট



0

আপনি যদি পছন্দসই আউটপুট হিসাবে একই ফরম্যাটে ফলাফল চান আপনি চেষ্টা করতে পারেন:

for file in `ls file{1..3}.txt`; \
do echo $file | cut -d '.' -f 1; \ 
cat $file  ; done;

ফলাফল:

file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow

আপনি echo -eকাটা আগে এবং পরে রাখতে পারেন যাতে আপনার পাশাপাশি লাইনগুলির মধ্যে ব্যবধান থাকে:

$ for file in `ls file{1..3}.txt`; do echo $file | cut -d '.' -f 1; echo -e; cat $file; echo -e  ; done;

ফলাফল:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow

ব্যাখ্যা: কমান্ডের ফলাফলের ফলে forলুপটি যায় goes ফলাফল: প্রতিটি পুনরাবৃত্তির হবে স্ট্রিং তারপর, এটা একটি মধ্যে পাইপ এর কমান্ড যেখানে আমি ব্যবহৃত একটি ক্ষেত্র বিভাজক যা দুই টুকরা এবং field1 আউট প্রিন্ট (field2 পাঠ্য হয়) বাকি স্পষ্ট হওয়া উচিত মধ্যে fileX.txt ভঙ্গ হিসাবেls$ ls file{1..3}.txtfile1.txt file2.txt file3.txtecho$filecut.
Fekete সুমের

0
  • এআইএক্স 7.1 কেএসএসি

... যারা ইতিমধ্যে মাথা উল্লেখ করেছেন তাদের উপর জ্বলজ্বল করে আমাদের মধ্যে কিছু কাজ করে:

$ r head
head file*.txt
==> file1.txt <==
xxx
111

==> file2.txt <==
yyy
222
nyuk nyuk nyuk

==> file3.txt <==
zzz
$

আমার প্রয়োজন প্রথম লাইনে পড়া; যেমনটি উল্লেখ করা হয়েছে, আপনি যদি 10 টিরও বেশি লাইন চান তবে আপনাকে বিকল্পগুলি যুক্ত করতে হবে (হেড -9999, ইত্যাদি)।

একটি ডেরাইভেটিভ মন্তব্য পোস্ট করার জন্য দুঃখিত; কারও মন্তব্যে মন্তব্য করার / যুক্ত করার মতো পর্যাপ্ত স্ট্রিট ক্রেডিট আমার কাছে নেই।


-1

এই কাজগুলি সমাধান করার জন্য আমি সাধারণত নিম্নলিখিত কমান্ডটি ব্যবহার করি:

$ cat file{1..3}.txt >> result.txt

ফাইলগুলির সংখ্যা বেশ বড় হলে ফাইলগুলি সংযুক্ত করার পক্ষে এটি একটি খুব সুবিধাজনক উপায়।


1
তবে এটি ওপির প্রশ্নের উত্তর দেয় না।
কাভন্তুর

-3

প্রথমে আমি প্রতিটি ফাইল তৈরি করেছি: প্রতি ফাইলের জন্য প্রতিধ্বনি 'তথ্য'> file1.txt [123] .txt।

তারপরে আমি প্রতিটি ফাইল মুদ্রণ করেছিলাম তা নিশ্চিত করার জন্য তথ্যটি সঠিক ছিল: টেল ফাইল? টেক্সট

তারপরে আমি এটি করেছি: টেল ফাইল? .Txt >> মেইনফিল.টিএসটিএস্ট। এটি প্রতিটি ফাইলের তথ্য একটি প্রধান ফাইলে সংরক্ষণ করার জন্য মেইনফিল.টিএসটিএসটি তৈরি করেছে।

বিড়াল মেনফিল.টিএসটি এটি ঠিক আছে বলে নিশ্চিত করেছে।

==> file1.txt <== নীলমুগুডবিয়ার

==> file2.txt <== অসাধারণ পজম

==> file3.txt <== হাউনউউব্রাউনকো

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