বিড়াল "ইনপুট ফাইল হ'ল আউটপুট ফাইল" একাধিক ফাইল এক সাথে সংযুক্ত করার চেষ্টা করার সময়


4

পরিকল্পনাটি ছিল জাভার সমস্ত উত্সের লাইনগুলি এক ফাইলে পুনরাবৃত্তভাবে সংগ্রহ করা:

$ find . -name '*.java' | xargs cat >> all.java

তবে একটি ত্রুটি ছিল:

cat: ./all.java: input file is output file

all.javaএই কমান্ডের আগে ফাইলটির অস্তিত্ব ছিল না, তাই আমি ভেবেছিলাম যে সম্ভবত xargsচালানোর চেষ্টা করছেcat >> all.java file1 file2 file3 ...


আরও unix.stackexchange.com প্রশ্নের মতো শোনাচ্ছে
user66001

@ user66001 এটি এখানে খাপ খায় না? কম্পিউটার উত্সাহী এবং বিদ্যুৎ ব্যবহারকারীর জন্য ব্যতীত আমি কেবল চেষ্টা করেছি এবং এই সাইটের স্কোপের একটি সংক্ষিপ্তসার খুঁজে পাইনি ...
ইভগেনি সার্জিভ

@ ব্যবহারকারী 66001 এই প্রশ্নটি এখানে 100% topic এটি ইউনিক্স এবং লিনাক্সে স্বাগত জানানো হবে তবে এটি সুপার ব্যবহারকারীর পক্ষেও বেশ উপযুক্ত ।
টেরডন

@ ইটারডন এবং এভেজেনি সার্জিভ - কেবল লিনাক্স / ইউনিক্স সম্পর্কিত প্রশ্নগুলির জন্য তাদের একটি নির্দিষ্ট সাব সাইট হিসাবে দেখার বিষয়টি ভেবে দেখেছি যে এই প্রশ্নটি সেখানে আরও ভালভাবে বসবাস করতে পারে। উভয় সাইটে এটি প্রযুক্তিগতভাবে বুঝতে হবে তা বুঝতে। ইভজেনি সার্জিভ - এখানে একটি সাইটের সুযোগ রয়েছে যা উপরে থেকে নীচে পড়ার জন্য একটি ব্যাজও উপার্জন করতে পারে।
ব্যবহারকারী 66001

উত্তর:


6

প্রথমত, আপনি নিরাপদে সেই ত্রুটিটিকে উপেক্ষা করতে পারেন। কমান্ডটি সফলভাবে চলবে এবং এটি সঠিকভাবে all.javaনিজেকে উপেক্ষা করবে। এটি কেবল আপনাকে জানাতেই পারে যে এটি এটি করেছে।

যাইহোক, ত্রুটি এড়াতে আপনি ব্যবহার করতে teeএবং find'sএক্সিকিউট অপশনটি ব্যবহার করতে পারেন :

$ find . -name '*.java' -exec cat {} + | tee all.java

থেকে man find:

   -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of `;' is encountered.  The string `{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command, not just in arguments
          where it is alone, as in some versions of find. 

   -exec command {} +
          This  variant  of the -exec action runs the specified command on
          the selected files, but the command line is built  by  appending
          each  selected file name at the end; the total number of invoca‐
          tions of the command will  be  much  less  than  the  number  of
          matched  files. 

সুতরাং, আপনি এর ফলাফলগুলির প্রতিটিতে একটি কমান্ড চালাতে -execবলার findজন্য ব্যবহার করতে পারেন । {}প্রকৃত ফাইল / ডাইরেক্টরি খুঁজে পাওয়া নামের সঙ্গে প্রতিস্থাপিত হয়। +শুধু মার্কার যে বলে হয় findযে কমান্ড এখানে শেষ। আমি এটির পরিবর্তে এটি ব্যবহার করি \;কারণ এটি কম কমান্ড চালাবে কারণ এটি তাদের যতটা সম্ভব কম রানের সাথে সংযুক্ত করার চেষ্টা করবে।

বা খুঁজে বের !করতে ব্যবহার করুন all.java:

$ find . -name '*.java' ! -name all.java -exec cat {} +  >> all.java

বা গ্লোববিং :

$ shopt -s globstar
$ cat **/*.java > all.java

এর জন্য গুগলিংcat {} + কিছুটা জটিল ... এবং স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 2188199/ … এটি ব্যাখ্যা করে না ... আমি মনে করি না আমি এই প্যাটার্নটি আগে দেখেছি।
এভেজেনি সার্জিভ

@EvgeniSergeev তারা অপশন করছে find। আপডেট দেখুন।
টেরডন

3

সমস্যাটি হ'ল প্রথমে ফাইলটি all.javaতৈরি হয়েছিল, তারপরে findএটি খুঁজে পেয়েছিল এবং এটি খাওয়িয়েছে cat, যা এটি পছন্দ করে না কারণ এটি আউটপুট করে চলেছে।

সম্ভাব্য সমাধান:

$ find . -name '*.java' | xargs cat >> all.j

বা:

$ find . -name '*.java' | xargs cat >> ../all.java
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.