টিএল; ডিআর: আপনি যদি খুব সঠিক উত্তরের জন্য এখানে থাকেন তবে আপনি সম্ভবত আমার ব্যক্তিগত পছন্দ চান, find . -name '*.txt' -exec process {} \;
(এই পোস্টের নীচে দেখুন)। আপনার যদি সময় থাকে তবে বিভিন্ন মাধ্যমে এবং বেশিরভাগের সমস্যাগুলি দেখতে বাকীটি পড়ুন।
পুরো উত্তর:
সেরা উপায় আপনি কী করতে চান তার উপর নির্ভর করে তবে এখানে কয়েকটি বিকল্প রয়েছে। যতক্ষণ না সাবট্রির কোনও ফাইল বা ফোল্ডারের নামে সাদা জায়গা নেই, আপনি কেবল ফাইলগুলি লুপ করতে পারেন:
for i in $x; do # Not recommended, will break on whitespace
process "$i"
done
প্রান্তিকভাবে ভাল, অস্থায়ী পরিবর্তনশীল কেটে দিন x
:
for i in $(find -name \*.txt); do # Not recommended, will break on whitespace
process "$i"
done
এটা অনেক ভাল উল্লিখিত glob যখন আপনি করতে পারেন। বর্তমান ডিরেক্টরিতে ফাইলের জন্য সাদা-স্থান নিরাপদ:
for i in *.txt; do # Whitespace-safe but not recursive.
process "$i"
done
globstar
বিকল্পটি সক্ষম করে আপনি এই ডিরেক্টরিতে এবং সমস্ত উপ-ডিরেক্টরিতে সমস্ত মিলে যাওয়া ফাইলকে গ্লোব করতে পারেন:
# Make sure globstar is enabled
shopt -s globstar
for i in **/*.txt; do # Whitespace-safe and recursive
process "$i"
done
কিছু ক্ষেত্রে যেমন, যদি ফাইলের নামগুলি একটি ফাইলে ইতিমধ্যে থাকে তবে আপনার ব্যবহারের প্রয়োজন হতে পারে read
:
# IFS= makes sure it doesn't trim leading and trailing whitespace
# -r prevents interpretation of \ escapes.
while IFS= read -r line; do # Whitespace-safe EXCEPT newlines
process "$line"
done < filename
read
find
ডিলিমিটারটি যথাযথভাবে সেট করে সুরক্ষিতভাবে ব্যবহার করা যেতে পারে :
find . -name '*.txt' -print0 |
while IFS= read -r -d '' line; do
process "$line"
done
আরও জটিল অনুসন্ধানের জন্য, আপনি সম্ভবত find
এটির -exec
বিকল্পের সাহায্যে বা ব্যবহার করতে চাইবেন -print0 | xargs -0
:
# execute `process` once for each file
find . -name \*.txt -exec process {} \;
# execute `process` once with all the files as arguments*:
find . -name \*.txt -exec process {} +
# using xargs*
find . -name \*.txt -print0 | xargs -0 process
# using xargs with arguments after each filename (implies one run per filename)
find . -name \*.txt -print0 | xargs -0 -I{} process {} argument
find
-execdir
পরিবর্তে ব্যবহার করে কমান্ড চালানোর আগে প্রতিটি ফাইলের ডিরেক্টরিতে সিডি -exec
করতে পারে এবং -ok
পরিবর্তে -exec
(বা -okdir
পরিবর্তে ) ব্যবহার করে ইন্টারেক্টিভ (প্রতিটি ফাইলের জন্য কমান্ড চালানোর আগে প্রম্পট -execdir
) করা যায়।
*: প্রযুক্তিগতভাবে, উভয় find
এবং xargs
(ডিফল্টরূপে) কমান্ডটি যতটা আর্গুমেন্টের সাথে কমান্ড লাইনে ফিট করতে পারে ততবার চালাবে, যতবার সমস্ত ফাইলের মধ্যে এটি লাগে। অনুশীলনে, আপনার যদি খুব বড় সংখ্যক ফাইল না থাকে তবে তা বিবেচনাধীন নয় এবং যদি আপনি দৈর্ঘ্য অতিক্রম করে থাকেন তবে সেগুলি একই কমান্ড লাইনে প্রয়োজন হয়, আপনি অন্যরকম উপায় খুঁজে পাবেন।