উত্তর:
বাশ বা কেএস-তে, ফাইলের নামগুলি একটি অ্যারেতে রাখুন এবং সেই অ্যারের উপরে বিপরীত ক্রমে পুনরাবৃত্তি করুন।
files=(/var/logs/foo*.log)
for ((i=${#files[@]}-1; i>=0; i--)); do
bar "${files[$i]}"
done
ksh_arrays
বিকল্পটি সেট করা থাকলে উপরের কোডটিও zsh এ কাজ করে (এটি ksh এমুলেশন মোডে রয়েছে)। জেডএসে একটি সহজ পদ্ধতি রয়েছে, যা গ্লোব কোয়ালিফায়ারের মাধ্যমে ম্যাচের ক্রমটি বিপরীত করা:
for f in /var/logs/foo*.log(On); do bar $f; done
পসিক্স অ্যারেগুলিকে অন্তর্ভুক্ত করে না, সুতরাং আপনি যদি পোর্টেবল হতে চান তবে আপনার স্ট্রিংগুলির একটি অ্যারে সরাসরি সঞ্চয় করার বিকল্পটি অবস্থানগত পরামিতি।
set -- /var/logs/foo*.log
i=$#
while [ $i -gt 0 ]; do
eval "f=\${$i}"
bar "$f"
i=$((i-1))
done
i
এবং f
; কেবলমাত্র একটি সম্পাদন করুন shift
, $1
আপনার কলটি ব্যবহার bar
করুন [ -z $1 ]
এবং আপনার মধ্যে পরীক্ষা করুন while
।
[ -z $1 ]
না [ -z "$1" ]
দরকারী পরীক্ষা হয় (যদি প্যারামিটার ছিল *
, অথবা একটি খালি স্ট্রিং?)। এবং যে কোনও ক্ষেত্রে তারা এখানে সহায়তা করে না: বিপরীত ক্রমে কীভাবে লুপ করবেন তা প্রশ্ন।
আপনি চেষ্টা করুন যদি না আপনি লাইন ব্রেককে "ফানকি চরিত্র" হিসাবে বিবেচনা করেন:
ls /var/logs/foo*.log | tac | while read f; do
bar "$f"
done
f
আমার পরিস্থিতিতে পরিবর্তনশীলকে ভেঙে দিয়েছে । এই উত্তরটি যদিও সাধারণ for
লাইনের জন্য একটি ড্রপ-ইন প্রতিস্থাপন হিসাবে বেশ কার্যকরভাবে কাজ করে ।
যদি কেউ কোনও স্থান-বিস্মৃত স্ট্রিং তালিকার উপরে কীভাবে পুনরাবৃত্তি করতে হয় তা নির্ধারণের চেষ্টা করছেন, এটি কাজ করে:
reverse() {
tac <(echo "$@" | tr ' ' '\n') | tr '\n' ' '
}
list="a bb ccc"
for i in `reverse $list`; do
echo "$i"
done
> ccc
> bb
> a
tac
জিএনইউ কোর্টিলসের অংশ হিসাবে এটি ধরণের ধাক্কা ocking তবে আপনার সমাধানটিও ভাল।
tac
। যদিও tac
এখানে অবিরাম প্রতিক্রিয়াগুলির সংখ্যা থেকে আমি অনুমান করি যে সম্ভবত ওএসএক্সের কাছে ট্যাক নেই। এই ক্ষেত্রে @ আরপের সমাধানের কিছু বৈকল্পিক ব্যবহার করুন - যাইহোক এটি বোঝা সহজ।
find /var/logs/ -name 'foo*.log' -print0 | tail -r | xargs -0 bar
আপনি যেভাবে চান সেটি পরিচালনা করা উচিত (এটি ম্যাক ওএস এক্সে পরীক্ষা করা হয়েছিল এবং আমার নীচে একটি সতর্কীকরণ রয়েছে ...)।
সন্ধানের জন্য ম্যান পৃষ্ঠা থেকে:
-print0
This primary always evaluates to true. It prints the pathname of the current file to standard output, followed by an ASCII NUL character (charac-
ter code 0).
মূলত, আপনি সেই ফাইলগুলি সন্ধান করছেন যা আপনার স্ট্রিং + গ্লোব এর সাথে মেলে এবং প্রতিটি এনওএল চরিত্রের সাথে শেষ করে। যদি আপনার ফাইলের নামগুলিতে নিউলাইনস বা অন্যান্য অদ্ভুত অক্ষর থাকে তবে এটি ভালভাবে পরিচালনা করা উচিত find
tail -r
পাইপের মধ্য দিয়ে স্ট্যান্ডার্ড ইনপুট নেয় এবং এটির বিপরীত ঘটে (নোট করুন যে সমস্ত ইনপুট স্টাডাউটে tail -r
প্রিন্ট করে , এবং কেবল সর্বশেষ 10 লাইন নয়, এটিই স্ট্যান্ডার্ড ডিফল্ট more আরও তথ্যের জন্য)।man tail
আমরা তারপরে পাইপ দিন xargs -0
:
-0 Change xargs to expect NUL (``\0'') characters as separators, instead of spaces and newlines. This is expected to be used in concert with the
-print0 function in find(1).
এখানে, xargs NUL অক্ষর দ্বারা বিভক্ত আর্গুমেন্টগুলি দেখতে প্রত্যাশা করে, যা আপনি পাশ থেকে find
বিপরীত করেছেন tail
।
আমার সতর্কতা: আমি পড়েছি যে tail
নাল-সমাপ্ত স্ট্রিংগুলির সাথে ভাল খেলছে না । এটি ম্যাক ওএস এক্সে ভাল কাজ করেছে, তবে আমি সমস্ত * নিক্সের ক্ষেত্রে এটির গ্যারান্টি দিতে পারি না। সাবধানে চলুন।
আমার আরও উল্লেখ করা উচিত যে GNU সমান্তরাল প্রায়শই xargs
বিকল্প হিসাবে ব্যবহৃত হয় । আপনি এটিও পরীক্ষা করে দেখতে পারেন।
আমি কিছু অনুপস্থিত হতে পারে, তাই অন্যদের চিম্বই করা উচিত।
tail -r
যদিও সমর্থন করে না ... আমি কি কিছু ভুল করছি?
tac
বিকল্প হিসাবে উল্লেখ করেছেন, তাই আমি তার পরিবর্তে চেষ্টা করব
tail -r
ওএসএক্সের সাথে সুনির্দিষ্ট, এবং নিউলাইন-সীমাবদ্ধ ইনপুটটি বিপরীত করে, নাল-সীমানিত ইনপুটটি নয়। আপনার দ্বিতীয় সমাধানটি কিছুতেই কাজ করে না (আপনি ইনপুটটি পাইপ করছেন ls
, যা যত্ন করে না); এমন কোনও সহজ ফিক্স নেই যা এটি নির্ভরযোগ্যভাবে কাজ করবে।
আপনার উদাহরণে আপনি বেশ কয়েকটি ফাইলের উপরে লুপিং করছেন তবে আমি আরও সাধারণ শিরোনামের কারণে এই প্রশ্নটি পেয়েছি যা কোনও অ্যারের উপরে লুপিংকে আবৃত করতে পারে বা কোনও সংখ্যার অর্ডারের ভিত্তিতে বিপরীত হতে পারে।
জেডশিতে এটি কীভাবে করা যায় তা এখানে:
আপনি যদি অ্যারেতে উপাদানগুলি লুপ করছেন তবে এই সিনট্যাক্সটি ( উত্স ) ব্যবহার করুন
for f in ${(Oa)your_array}; do
...
done
O
পরবর্তী পতাকাটিতে উল্লিখিত ক্রমের বিপরীতগুলি; a
সাধারণ অ্যারে অর্ডার।
@ গিলিস যেমন বলেছিল, On
আপনার গ্লোববেড ফাইলগুলিকে বিপরীত করবে, যেমন my/file/glob/*(On)
। এটি কারণ On
"বিপরীত নাম ক্রম"।
Zsh বাছাই পতাকা:
a
অ্যারের অর্ডারL
ফাইলের দৈর্ঘ্যl
লিঙ্ক সংখ্যাm
পরিবর্তন তারিখn
নাম^o
বিপরীত ক্রম ( o
স্বাভাবিক ক্রম)O
বিপরীত ক্রমউদাহরণস্বরূপ, https://github.com/grML/zsh-lovers/blob/master/zsh-lovers.1.txt এবং http://reasoniamhere.com/2014/01/11/outrageously-useful-tips- দেখুন টু-মাস্টার-আপনার-Z-শেল /
ম্যাক ওএসএক্স tac
আদেশটি সমর্থন করে না । @ টিসিডিএল দ্বারা সমাধানটি কাজ করে যখন আপনি for
লুপে একটি একক কমান্ড কল করছেন । অন্যান্য সমস্ত ক্ষেত্রে, নীচে এটি কাছাকাছি যাওয়ার সহজ উপায়।
এই পদ্ধতির আপনার ফাইলের নামগুলিতে নতুন লাইন থাকা সমর্থন করে না। অন্তর্নিহিত কারণটি হ'ল, tail -r
নতুন লাইনগুলি দ্বারা সীমিত হিসাবে এটি তার ইনপুটটি সাজায়।
for i in `ls -1 [filename pattern] | tail -r`; do [commands here]; done
তবে নতুন লাইনের সীমাবদ্ধতার আশেপাশে যাওয়ার একটি উপায় রয়েছে। যদি আপনি জানেন যে আপনার ফাইলের নামগুলিতে একটি নির্দিষ্ট অক্ষর নেই (বলুন, '='), তবে আপনি tr
এই চরিত্রটি হয়ে উঠতে সমস্ত নতুনলাইনগুলি প্রতিস্থাপন করতে ব্যবহার করতে পারেন এবং তারপরে বাছাই করতে পারেন। ফলাফলটি নিম্নলিখিত হিসাবে দেখাবে:
for i in `find [directory] -name '[filename]' -print0 | tr '\n' '=' | tr '\0' '\n'
| tail -r | tr '\n' '\0' | tr '=' '\n' | xargs -0`; do [commands]; done
দ্রষ্টব্য: আপনার সংস্করণটির উপর নির্ভর করে tr
এটি '\0'
অক্ষর হিসাবে সমর্থন নাও করতে পারে । এটি স্থানীয়ভাবে সি-তে পরিবর্তিত করে প্রায় কাজ করা যেতে পারে (তবে আমি ঠিক কীভাবে মনে করতে পারি না, কারণ এটি ঠিক করার পরে এটি এখন আমার কম্পিউটারে একবার কাজ করে)। যদি আপনি একটি ত্রুটি বার্তা পেয়ে থাকেন এবং আপনি কাজের দিকটি খুঁজে না পান তবে দয়া করে এটি একটি মন্তব্য হিসাবে পোস্ট করুন, তাই আমি এটির সমস্যা সমাধানে আপনাকে সহায়তা করতে পারি।
sort -r
আগে পাইপ করুনfor
বা এর মধ্য দিয়ে লন্ডার করুনls -r
।