g কমান অনুসন্ধান কমান্ডে রান করার সময় সঠিক আউটপুট উত্পন্ন করে না


0

আমার টাস্কটি ব্যবহার না করেই বর্তমান ডিরেক্টরীতে ফাইলগুলির সংখ্যা মুদ্রণ করতে হয় ls এবং wc কমান্ড।

আমি স্ক্রিপ্টে নিম্নলিখিত লাইন টাইপ করেছি:

#!/bin/bash
find . -maxdepth 1 -type f \( ! -iname ".*" \) > list3
grep .* -c list3 > /dev/tty

আউটপুট হয়:

..:0
.6.1c.sh.swp:1
list3:22

আমার বোঝার অনুযায়ী এটি শুধুমাত্র হওয়া উচিত: 22

কেন যে কাজ করে না?

উত্তর:


3

কেন grep সঠিকভাবে কাজ করছে না

আপনি কাজ করতে হবে কারণ এটি কাজ করে না grep যে .* আপনি খুঁজছেন হয় আসল প্যাটার্ন।

grep '.*' -c list3

আপনি যদি একক উদ্ধৃতি ব্যবহার না করেন তবে আপনার শেলটি প্রসারিত হবে .* আপনার ডিরেক্টরির মধ্যে প্রতিটি ফাইলের নাম। এই বলা হয় ফাইল নাম সম্প্রসারণ । উদাহরণ স্বরূপ a.txt b.txt, তাই grep দেখবো:

grep a.txt b.txt -c list3

থেকে একক উদ্ধৃতি ঘটনার থেকে বিস্তার প্রতিরোধ করুন, এটি এখানে যাওয়ার উপায়।


যেখানে আপনার grep কমান্ড ভুল

যাইহোক, আপনি এখানে প্যাটার্ন সঙ্গে ভুল দিক যাচ্ছে। কাল . একটি নিয়মিত অভিব্যক্তি ম্যাচ কোন চরিত্র, এবং আক্ষরিক ডট না। দেখ দ্য man পৃষ্ঠা আরও তথ্যের জন্য. সুতরাং আপনার regex বর্তমানে বলেছেন: "কোন অক্ষর এবং তারপর কোনো চরিত্র একটি ক্রম খুঁজে।"। বেশ অপ্রত্যাশিত।

আপনি যদি সত্যিই মিলা মানে:

[বিন্দু] [অন্য কিছু]

... আপনি বিন্দু থেকে পালাতে হবে:

\.*

যেখানে আপনার find কমান্ড উন্নত করা যেতে পারে:

আমি আপনি পরিত্রাণ পেতে মানে কি জানি না

\( ! -iname ".*" \)

তোমার find কমান্ডটি বর্তমান কাজ নির্দেশকের জন্য বিন্দু সহ কোনও ফাইলকে উপসর্গ করবে, এইভাবে আপনি এখানে কোনও জিনিস সরাতে পারবেন না। আপনি শুধু চালাতে পারে:

find . -maxdepth 1 -type f

1

মূল সমস্যা মোকাবেলা, ছাড়া ফাইল গণনা ls এবং wc:

বিশুদ্ধ শেল সিনট্যাক্স:

files=0
for i in *; do
    [ -f "${i}" ] && files=$((files+1))
done
echo ${files}

গণনা করার জন্য লুকানো ফাইল যোগ করার জন্য, পূর্বে globbing সেটিংস পরিবর্তন করুন for লুপ.

বিকল্পভাবে: সঙ্গে মজা find এবং শেল বিস্তার:

echo $(($(find -maxdepth 1 -type f -printf '+1')))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.