প্রথম ম্যাচের পরে কীভাবে ফাইন্ড কমান্ড বন্ধ করবেন?


131

findপ্রথম ম্যাচটি সন্ধান করার পরে কমান্ডকে ডান থামানোর জন্য বাধ্য করার কোনও উপায় আছে ?


4
দ্য ইউনসিন: পাঁচটি ফলাফলের পরে এটি প্রস্থান করার কারণটি হেড -n 5 এ প্রস্থান করা হয় কারণ পাঁচটি ফলাফলের পরে মাথাটি বাইরে বের হয়। যখন মাথাটি প্রস্থান করে পাইপটি বন্ধ হয় এবং প্রোগ্রামটিকে পাইপ দিয়ে সিগন্যাল প্রেরণ করে পাশাপাশি বন্ধ করতে termin আপনাকে সরাসরি প্রতিক্রিয়া না দেওয়ার জন্য দুঃখিত, আপাতদৃষ্টিতে জবাব দেওয়ার জন্য আপনার 50 খ্যাতি দরকার।
রুস্ত

উত্তর:


148

জিএনইউ বা ফ্রিবিএসডি এর সাহায্যে findআপনি -quitপ্রিডিকেটটি ব্যবহার করতে পারেন :

find . ... -print -quit

নেটবিএসডি findসমতুল্য:

find . ... -print -exit

আপনি যদি সমস্ত কিছু করেন তবে নাম মুদ্রণ করা হয় এবং ধরে নেওয়া হয় যে ফাইলের নামগুলিতে নতুন লাইন অক্ষর নেই, আপনি করতে পারেন:

find . ... -print | head -n 1

findএটি প্রথম ম্যাচের পরে থামবে না , তবে সম্ভবত দ্বিতীয় ম্যাচের সময় নির্ধারণ এবং বাফারিংয়ের উপর নির্ভর করে বা পরে (অনেক কিছু)। মূলত, findএকটি সাইনপাইপ দিয়ে শেষ করা হবে যখন এটি headইতিমধ্যে চলে যাওয়ার সময় কিছু আউটপুট দেওয়ার চেষ্টা করে কারণ এটি ইতিমধ্যে ইনপুটটির প্রথম লাইনটি পড়ে এবং প্রদর্শিত হয়েছে।

মনে রাখবেন যে সমস্ত শেলগুলি ফিরে আসার findপরে সেই আদেশটির জন্য অপেক্ষা করবে না head। বোর্ন শেল এবং এটি অ্যান্ড টি বাস্তবায়ন ksh(যখন অ ইন্টারেক্টিভ নয়) এবং yash(কেবলমাত্র সেই পাইপলাইনটি কোনও স্ক্রিপ্টের শেষ কমান্ড হয়) তা ব্যাকগ্রাউন্ডে চলবে না। আপনি যদি কোনও শেলের পরিবর্তে সেই আচরণটি দেখতে চান তবে আপনি সর্বদা উপরেরটি এতে পরিবর্তন করতে পারেন:

(find . ... -print &) | head -n 1

যদি আপনি পাওয়া ফাইলগুলির পাথ মুদ্রণের চেয়ে আরও বেশি কিছু করেন তবে আপনি এই পদ্ধতির চেষ্টা করতে পারেন:

find . ... -exec sh -c 'printf "%s\n" "$1"; kill "$PPID"' sh {} \;

( printfআপনি যে ফাইলটি দিয়ে যাবেন তা প্রতিস্থাপন করুন)।

এটি findপ্রস্থান স্থিতি ফিরে আসার পার্শ্ব প্রতিক্রিয়াটি দেখায় যে যদিও এটি নিহত হয়েছিল।

প্রকৃতপক্ষে, SIGTERM ( kill -s PIPEপরিবর্তে kill) এর পরিবর্তে SIGPIPE সিগন্যাল ব্যবহারের ফলে কিছু শাঁস সেই মৃত্যু সম্পর্কে আরও নীরব হয়ে উঠবে (তবে এখনও শূন্য-বহির্গমন স্থিতি ফিরে আসবে)।


3
বাশ এবং জিএনইউ ফাইন্ডে যে কোনও ফাইলের পূর্বাভাসগুলির সাথে মেলে কিনা তা পরীক্ষা করতে হবে, বাশ এবং জিএনইউ ফাইন্ডে আপনি যা করতে পারেন if [[ $(find ... -print -quit) ]]; then ...তা পরীক্ষা করে দেখবে: এটি প্রিন্ট করা কিছু পাওয়া যায় কিনা তা পরীক্ষা করে।
টোবিয়া

$(…)আপনি কেবলমাত্র একক বন্ধনী ব্যবহার করছেন সে ক্ষেত্রে @ টোবিয়ার অংশটি উদ্ধৃতিতে রেখে দেওয়া ভাল [ … ]
পিএইচকে

@ পিএফকে বাদে আমি একক বন্ধনী ব্যবহার করছি না (কারণ এগুলি ভয়ঙ্কর) সুতরাং আমার উদ্ধৃতি ব্যবহার করার দরকার নেই।
টোবিয়া 16'17

2
@ তোবিয়া, [একটি মানক কমান্ড। এটি এতটা কমান্ড নয় যে ভয়াবহ তবে বোর্নের মতো শেলগুলি কমান্ড লাইনকে পার্স করার উপায়। [[...]]এটি একটি কেএসআর কনস্ট্রাক্ট যা বিভিন্ন শেলের নিজস্ব ইস্যু রয়েছে। উদাহরণস্বরূপ, সাম্প্রতিক অবধি [[ $(...) ]]কাজ করা হয়নি zsh(আপনার প্রয়োজন [[ -n $(...) ]]) needed এগুলি ব্যতীত zshআপনার উদ্ধৃতিগুলি দরকার [[ $a = $b ]], [[ =~ ]]বাস্তবায়নের মধ্যে এমনকি বাশের সংস্করণ এবং কিছুতে কয়েকটি বাগের মধ্যেও অসম্পূর্ণ পার্থক্য রয়েছে। ব্যক্তিগতভাবে, আমি পছন্দ করি [
স্টাফেন চেজেলাস

কি ...? ।
kyb

11
find . -name something -print -quit

এটি মুদ্রণের পরে প্রথম ম্যাচের পরে খুঁজে পাওয়া শেষ করে।

নির্দিষ্ট পরিমাণের ম্যাচ এবং মুদ্রণের ফলাফলের পরে অনুসন্ধানটি সমাপ্ত করুন:

find . -name something -print | head -n 5

আশ্চর্যজনকভাবে যথেষ্ট - মাথা এখন 5 ম্যাচের পরে স্ট্রিং শেষ করে, যদিও কীভাবে বা কেন জানি না।

এটি পরীক্ষা করা খুব সহজ। শুধু দিন অনুসন্ধান খুঁজে একটি রুট যা হাজার হাজার হয়তো, আরও বেশি ম্যাচ স্থাপিত হবে যখন অন্তত একটি মিনিট বা তার বেশি গ্রহণ। তবে "হেড" "পাই" তে পাইপ দেওয়া হলে মাথার নির্ধারিত রেখাগুলির নির্দিষ্ট পরিমাণের পরে সমাপ্ত হবে (ডিফল্ট শিরোনাম 10 দেখায়, লাইন নির্দিষ্ট করতে "হেড-এন" ব্যবহার করুন)।

নোট করুন যে "হেড-এন" নির্দিষ্ট করা নিউলাইন চরিত্রের গণনায় পৌঁছানোর পরে এটি সমাপ্ত হবে এবং অতএব যে কোনও মিলের মধ্যে একাধিক নিউলাইন অক্ষর রয়েছে according


আমি এটিও লক্ষ্য করেছি যে এই 'প্রোগ্রামটি আউটপুট নিয়ে মাথা শেষ হওয়ার পরে' শেষ হয়ে যায়, তবে ধারাবাহিকভাবে শেলগুলি জুড়ে নয়। আমি মনে করি এটির নিজস্ব প্রশ্নের যোগ্যতা রয়েছে - ভাগ্যক্রমে ব্যাশের জন্য উত্তরটি ইতিমধ্যে স্ট্যাকওভারফ্লোয়ের ব্যাশে রয়েছে: ব্যাশ স্ক্রিপ্টের সাথে শিরোনাম ও লেজ আচরণ । এটি আমার পক্ষে এই উপসংহারে পর্যাপ্ত তথ্য দেয় যে প্রোগ্রামটি সমাপ্ত হয় বা পটভূমিতে সম্পাদন করা চালিয়ে যায় কিনা তা সাইনপাইপের প্রতিক্রিয়া নির্ভর করে - হত্যার ডিফল্ট।
ঋষি

আমি বোঝাতে চাইছি 'প্রোগ্রামগুলি * / শেলগুলি জুড়ে', তবে দৃশ্যত unix.stackex بدل.com আমার প্রথম মন্তব্য সম্পাদনা করার পরিবর্তে এটি দ্বিতীয় মন্তব্য হিসাবে লগইন করতে পছন্দ করবে (এটি একটি স্ট্যাকেক্সচেঞ্জ, সাইট-নির্দিষ্ট নীতিগত সিদ্ধান্ত)। এছাড়াও, আমি এখন দেখতে যে @Ruste শীর্ষ, যা আমার প্রাথমিকভাবে সাহায্য করা হয়নি এই মর্মে মন্তব্য যেহেতু আমি সোজা উত্তর ... গিয়েছিলাম
ঋষি

2

বিনোদনের উদ্দেশ্যে, এখানে বাশের একটি অলস সন্ধানকারী জেনারেটর। এই উদাহরণটি বর্তমান ডিরেক্টরিতে থাকা ফাইলগুলির উপরে একটি রিং তৈরি করে। আপনি পড়তে চান তবে অনেকগুলি পড়ুন kill %+(সম্ভবত কেবল 1)

#!/usr/bin/env bash
unset -v files n
trap 'kill "$x_PID"' EXIT

coproc x while :; do
    find . -type f -maxdepth 1 -exec sh -c "$(</dev/fd/3)" _ {} +
done 4<&0 <<\EOF 3<&0 <&4-
for x; do
    read -r _
    printf '%s\0' "$x"
done
EOF

while
    echo >&${x[1]}
    IFS= read -rd '' -u "$x" 'files[n++]'
do
    printf '%q ' "${files[@]}"
    echo
    sleep .2
done

1

, grep যদি পতাকা দিয়ে ব্যবহার করা ফেরৎ -m, যাতে

find stuff | grep -m1 .

এটি প্রথম লাইনের সাহায্যে মুদ্রণের পরে ফিরে আসবে।

এর মধ্যে পার্থক্যটি find stuff -print -quit | head -1হ'ল যদি অনুসন্ধানটি দ্রুত হয় তবে গ্রাপ সময়মতো প্রক্রিয়াটি থামাতে সক্ষম না হতে পারে (যদিও এটি সত্যিকার অর্থে কিছু যায় আসে না), যদিও অনুসন্ধান দীর্ঘ হলে এটি প্রিন্ট করার জন্য প্রয়োজনীয় নয় অনেকগুলি ফাঁকা করে দেবে লাইন।

এটি পরিবর্তে ব্যস্তবক্স অনুসন্ধানের সাথে কাজ করে, যদিও ব্যস্তবক্সের গ্রেপ থেকে -mএটি আসলে প্রয়োজন হয় না

find /tmp/stuff -exec "sh" "-c" "eval 'echo {}; { kill \$PPID; }'" \;

এটি (সাধারণত) সিগটার্ম সংকেত প্রাপ্তির সন্ধানের প্রক্রিয়া সম্পর্কে একটি বার্তা ছুঁড়ে দেবে, তবে এই আউটপুটটি চলমান শেলের অন্তর্ভুক্ত, ফাইন্ড কমান্ড নয় সুতরাং এটি কমান্ড আউটপুট নিয়ে বিঘ্নিত হয় না, অর্থ পাইপ বা পুনর্নির্দেশগুলি কেবল লাইনটিকে আউটপুট দেবে meaning মেলে

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