ধরুন কমান্ড (যেমন ls -1
) থেকে আমার কিছু আউটপুট রয়েছে :
a
b
c
d
e
...
আমি ঘুরেফিরে প্রত্যেককে একটি আদেশ (বলুন echo
) প্রয়োগ করতে চাই । যেমন
echo a
echo b
echo c
echo d
echo e
...
ব্যাশে এটি করার সহজতম উপায় কী?
ধরুন কমান্ড (যেমন ls -1
) থেকে আমার কিছু আউটপুট রয়েছে :
a
b
c
d
e
...
আমি ঘুরেফিরে প্রত্যেককে একটি আদেশ (বলুন echo
) প্রয়োগ করতে চাই । যেমন
echo a
echo b
echo c
echo d
echo e
...
ব্যাশে এটি করার সহজতম উপায় কী?
উত্তর:
এটি সম্ভবত ব্যবহার করা সবচেয়ে সহজ xargs
। তোমার ক্ষেত্রে:
ls -1 | xargs -L1 echo
-L
পতাকা নিশ্চিত করে ইনপুট সঠিকভাবে পড়া হয়। ম্যান পৃষ্ঠা থেকে xargs
:
-L number
Call utility for every number non-empty lines read.
A line ending with a space continues to the next non-empty line. [...]
ls
স্বয়ংক্রিয়ভাবে -1
একটি পাইপে করে।
ls | xargs -L2 echo
এবং ls -1 | xargs -L2 echo
দুটি ভিন্ন আউটপুট দিন। প্রাক্তন সবাই এক লাইনে রয়েছেন।
xargs
শেল ফাংশন বা শেল বিল্ট-ইন কমান্ড নয় কেবল এক্সিকিউটেবল ফাইলই চালাতে পারে। প্রাক্তনটির জন্য সবচেয়ে ভাল সমাধানটি সম্ভবত read
লুপযুক্ত।
-L1
জন্য একটি ব্যাখ্যা অন্তর্ভুক্ত করে ।
আপনি প্রতিটি লাইনে একটি বেসিক প্রিপেন্ড অপারেশন ব্যবহার করতে পারেন:
ls -1 | while read line ; do echo $line ; done
অথবা আপনি আরও জটিল ক্রিয়াকলাপের জন্য আউটপুটটি পাইপ করতে পারেন:
ls -1 | sed 's/^\(.*\)$/echo \1/'
sh: cho: not found a sh: cho: not found
দেখে মনে হচ্ছে এটি e
ইডোকে একটি সেড কমান্ড বা অন্য কোনও কিছু হিসাবে গ্রহণ করছে।
while
লুপের জন্য +1 । cmd1 | while read line; do cmd2 $line; done
। বা while read line; do cmd2 $line; done < <(cmd1)
যা একটি সাবশেল তৈরি করে না। এটি আপনার sed
আদেশের সরলীকৃত সংস্করণ :sed 's/.*/echo &/'
"$line"
যখন লুপ, এড়ানোর শব্দ বিভাজন করার জন্য।
read -r line
ঠেকাতে ব্যবহার করার চেষ্টা করুন read
। উদাহরণস্বরূপ, echo '"a \"nested\" quote"' | while read line; do echo "$line"; done
দেয় "a "nested" quote"
যা তার পলায়ন হারিয়েছে। আমরা যদি আমরা প্রত্যাশিত হিসাবে echo '"a \"nested\" quote"' | while read -r line; do echo "$line"; done
পেতে "a \"nested\" quote"
। দেখুন wiki.bash-hackers.org/commands/builtin/read
আপনি লুপের জন্য একটি ব্যবহার করতে পারেন :
* ফাইলের জন্য; করা প্রতিধ্বনি "$ ফাইল" সম্পন্ন
মনে রাখবেন যে প্রশ্নে থাকা কমান্ডটি যদি একাধিক যুক্তি স্বীকার করে, তবে xargs ব্যবহার করা প্রায়শই কার্যকর কারণ এটি কেবল একাধিকবারের পরিবর্তে একবারে প্রশ্নের ইউটিলিটিটি স্প্যান করতে হবে।
printf '%s\0' * | xargs -0 ...
- অন্যথায়, এটি হোয়াইটস্পেস, কোটস ইত্যাদির ফাইল নামগুলির সাথে বেশ নিরাপদ
এটি করার জন্য আপনি বাস্তবে সেড ব্যবহার করতে পারেন, তবে এটি GNU সেড হয়।
... | sed 's/match/command \0/e'
কিভাবে এটা কাজ করে:
cat /logs/lfa/Modified.trace.log.20150904.pw | sed -r 's/^(.*)(\|006\|00032\|)(.*)$/echo "\1\2\3 - ID `shuf -i 999-14999 -n 1`"/e'
for s in `cmd`; do echo $s; done
যদি সেন্টিমিডির একটি বড় আউটপুট থাকে:
cmd | xargs -L1 echo
cmd
এর আউটপুটে ফাঁকা স্থান থাকে তবে প্রথমটি ব্যর্থ হবে।
xargs ব্যাকস্ল্যাশ, উদ্ধৃতি সহ ব্যর্থ। এর মতো কিছু হওয়া দরকার
ls -1 |tr \\n \\0 |xargs -0 -iTHIS echo "THIS is a file."
xargs -0 বিকল্প:
-0, --null Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode.
ls -1
আইটেমগুলিকে নিউলাইন চরিত্রগুলি দিয়ে শেষ করে, তাই tr
এগুলি নাল অক্ষরে অনুবাদ করে।
এই পদ্ধতিটি ম্যানুয়ালি পুনরাবৃত্ত হওয়ার চেয়ে প্রায় 50 গুণ ধীর for ...
( মাইকেল অ্যারন সাফিয়ান এর উত্তর দেখুন) (3.55s বনাম 0.0.ss) s তবে অন্যান্য ইনপুট কমান্ডগুলির যেমন সনাক্ত (অনুসন্ধান tr \\n \\0 <file
), কোনও ফাইল ( ) বা অনুরূপ থেকে পড়ার জন্য , আপনাকে এটির xargs
মতো কাজ করতে হবে ।
আমার জন্য আরও ভাল ফলাফল:
ls -1 | xargs -L1 -d "\n" CMD
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 command
আউটপুট ls -1
অস্পষ্ট যেখানে ক্ষেত্রে পরিচালনা করবে ; আপনি প্রতিটি উপর একটি নেতৃস্থানীয় চান না -printf '%P\0'
পরিবর্তে ব্যবহার করুন। -print0
./
ls -1
এখানে উদাহরণ হতে পারে তবে এটি মনে রাখা গুরুত্বপূর্ণ যে এর আউটপুটটি পার্স করা ভাল নয়ls
। দেখুন: mywiki.wooledge.org/ পার্সিংএলস