কেন এটি কাজ করে না? “Ls * .txt | xargs বিড়াল> all.txt "(একক txt নথিতে সমস্ত ফাইল)


20

কেন এটি কাজ করে না?

ls *.txt | xargs cat > all.txt

(আমি সমস্ত পাঠ্য ফাইলের বিষয়বস্তুগুলিকে একটি একক 'all.txt' ফাইলে যোগ দিতে চাই)) -exec এর সাথেও কাজ করা উচিত তবে আমি xargs বাক্য গঠনটি বুঝতে চাই really

ধন্যবাদ


1
যদিও এর জন্য ব্যবহার করবেন নাls । আপনি যদি সত্যিই ব্যবহার করতে না পারেন cat *.txt >all.txtতবে চেষ্টা করুন printf '%s\0' *.txt | xargs -r0 cat >allএবং তারপরে mv all all.txtফাইলটি নিজেই উল্লেখ করা এড়ানো।
ট্রিপলি

উত্তর:


27

ls *.txt | xargs cat >> all.txt

এটি আরও ভাল কাজ করতে পারে, যেহেতু এটি প্রতিটি ফাইলের পরে আবার তৈরি না করে all.txt এ যুক্ত হবে।

যাইহোক, cat *.txt >all.txtএছাড়াও কাজ করবে। :-)


6
বিড়াল * .txt> all.txt স্বাভাবিকভাবেই ভাল। ধন্যবাদ
আজো

1
তবে, ... | xargs cat >> all.txt বা> all.txt সর্বদা xargs এর মাধ্যমে ত্রুটি ফেরায়: তুলনামূলক একক উদ্ধৃতি ... এর কারণ কি xargs কমান্ড হিসাবে তার পরে সমস্ত কিছু নেয়?
আজো

1
আপনার স্পেস সহ ফাইলের নাম আছে? যদি তা হয় তবে তার পরিবর্তে "সন্ধান / আপনার / পথের নাম '* .txt' -প্রিন্ট 0 | xargs -0 বিড়াল >> all.txt" এর মতো কিছু ব্যবহার করুন
জেন্ন পিক্কারাইনেন

1
না, আমি সমস্ত ফাইলের নাম স্পেস দিয়ে প্রতিস্থাপন করেছি । তবে এটি ভেবে কিছু ফাইলের নামই তালিকা_ও'কনর .txt হিসাবে একক উদ্ধৃতি অন্তর্ভুক্ত করতে পারে, এটি সমস্যা হতে পারে!
Ajo

হ্যাঁ, সমস্যাটি তখন। :) সবচেয়ে সহজ এবং স্যানিস্ট উপায় হ'ল-প্রিন্ট 0 এর সাথে xargs -0 এর সাথে মিলিত ব্যবহার করা - তারপরে পুরো শৃঙ্খলা পৃথক এবং সাদা স্থান হিসাবে NULL অক্ষরটি ব্যবহার করবে এবং বিশেষ অক্ষরগুলি স্বয়ংক্রিয়ভাবে যত্ন নেওয়া হবে।
জান্নে পিক্কারাইনেন

3

আপনার ফাইলের কিছুতে যদি ', "বা স্পেস থাকে তবে বিভাজক সমস্যারxargs কারণে ব্যর্থ হবে

সাধারণত চালানো হয় না xargs -0 ছাড়ুন না কারণ এটি ফিরে আসবে এবং কোনও দিন আপনাকে কামড় দেবে।

পরিবর্তে GNU সমান্তরাল ব্যবহার বিবেচনা করুন:

ls *.txt | parallel cat > tmp/all.txt

বা আপনি যদি পছন্দ করেন:

ls *.txt | parallel cat >> tmp/all.txt

জিএনইউ সমান্তরাল সম্পর্কে আরও জানুন http://www.youtube.com/watch?v=OpaiGYxkSuQ


1

all.txt একই ডিরেক্টরিতে একটি ফাইল, তাই বিড়াল বিভ্রান্ত হয় যখন সে একই ফাইল থেকে একই ফাইলে লিখতে চায়।

অন্য দিকে:

ls *.txt | xargs cat > tmp/all.txt

এটি আপনার বর্তমান ডিরেক্টরিতে পাঠ্য ফাইলগুলি থেকে একটি উপ-ডিরেক্টরিতে all.txt- এ পড়বে (এর সাথে অন্তর্ভুক্ত নয় *.txt)।


তবুও নিম্নলিখিত ত্রুটি: এক্সার্গস: একক উদ্ধৃতি নয়; ডিফল্ট কোট xargs বিশেষ হয়, যদি না আপনি -0 বিকল্প ব্যবহার
Ajo

1
আপনার নামে একটি একককোট সহ .txt ফাইল রয়েছে?
জেরেমি স্মিথ

0

আপনি একটি কমান্ড লাইনের দৈর্ঘ্যের সীমাবদ্ধতাও পেরিয়ে আসতে পারেন। ব্যবহারের কারণের অংশটি xargsহ'ল এটি নিরাপদ কমান্ড-লাইন-আকারের অংশগুলিতে ইনপুট বিভক্ত করে। সুতরাং, এমন একটি পরিস্থিতিতে কল্পনা করুন যেখানে আপনার ডিরেক্টরিতে কয়েক হাজার .txt ফাইল রয়েছে। ls *.txtঅকৃতকার্য হবে. আপনার করা দরকার

ls | grep .txt$ |xargs cat > /some/other/path/all.txt

.txt$এই ক্ষেত্রে .txt এ শেষ হওয়া সমস্ত কিছুর সাথে মিলে যাওয়া একটি নিয়মিত অভিব্যক্তি (সুতরাং এটি ঠিক তেমন পছন্দ হয় না *.txt, যেহেতু আপনার যদি কোনও ফাইল ডেকে থাকে atxt, তবে*.txt এটি মিলবে না, তবে নিয়মিত প্রকাশটি হবে would)

অন্য পাথের ব্যবহার হ'ল কারণ, অন্যান্য উত্তরগুলি যেমন নির্দেশ করেছে, all.txt প্যাটার্নের সাথে মিলেছে *.txtতাই ইনপুট এবং আউটপুটের মধ্যে দ্বন্দ্ব থাকতে পারে।

মনে রাখবেন যে যদি 'তাদের নামের সাথে কোনও ফাইল থাকে (এবং এটি unmatched single quoteত্রুটির কারণ হতে পারে ), আপনি এটি করতে চাইবেন

ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt

--Null বিকল্পটি গ্রেপকে ডিফল্ট নিউলাইনটির \0পরিবর্তে (ওরফে নাল) অক্ষর দ্বারা পৃথক আউটপুট ব্যবহার করতে বলে , এবং -0gs xargs বিকল্পটি একই ফর্ম্যাটে এটির ইনপুট আশা করতে বলে। এটিতে নতুন লাইনের সাথে আপনার ফাইল ফাইল থাকলেও এটি কাজ করবে।

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