আমার বর্তমান সেরা বেটটি হ'ল:
for i in $(find . -name *.jpg); do echo $i; done
সমস্যা: ফাইলের নামগুলিতে ফাঁকা স্থান পরিচালনা করে না।
দ্রষ্টব্য: আমি এটি করার একটি গ্রাফিকাল পদ্ধতিও পছন্দ করব, যেমন "ট্রি" কমান্ড।
আমার বর্তমান সেরা বেটটি হ'ল:
for i in $(find . -name *.jpg); do echo $i; done
সমস্যা: ফাইলের নামগুলিতে ফাঁকা স্থান পরিচালনা করে না।
দ্রষ্টব্য: আমি এটি করার একটি গ্রাফিকাল পদ্ধতিও পছন্দ করব, যেমন "ট্রি" কমান্ড।
উত্তর:
ক্যানোনিকাল উপায় হয়
find . -name '*.jpg' -exec echo {} \;
( একাধিক ফাইল পাস \;
করার +
জন্য প্রতিস্থাপন করুনecho
)
বা (জিএনইউ সুনির্দিষ্ট, যদিও কিছু বিএসডি এখন রয়েছে):
find . -name '*.jpg' -print0 | xargs -r0 echo
zsh:
for i (**/*.jpg(D)) echo $i
echo
হ'ল ব্যবহারের মতো নয় যা পালানোর ক্রমগুলি \b
(কমপক্ষে ইউনিক্স কনফরমেন্টস echo
) এর মতো প্রসারিত করে ।
find
র manpage শো find . -type f -exec file '{}' \;
মধ্যে EXAMPLES
অধ্যায়। সম্ভবত কিছু শাঁস বিশেষত ধনুর্বন্ধনী আচরণ করবে।
'{}'
, \{\}
, {}
, "{}"
, '{'}
শেল (যাই হোক না কেন বোর্ন মত শেল) দ্বারা একটি আর্গুমেন্ট যে দুই অক্ষর খুঁজে পেতে "{" এবং "}" সম্প্রসারিত করছে। "প্রতিধ্বনি" এর সাথে "অনুসন্ধান" প্রতিস্থাপন করুন, বা printf '<%s>\n' find
আপনি যদি ডাবল-চেক করতে চান তবে।
ইতিমধ্যে আরও ভাল উত্তর দেওয়া হয়েছে।
তবে মনে রাখবেন যে কোডগুলি আপনি দিয়েছেন তাতে শূন্যস্থানই কেবল সমস্যা নয়। ট্যাব, নিউলাইন এবং ওয়াইল্ডকার্ড অক্ষরগুলিও একটি সমস্যা।
সঙ্গে
IFS='
'
set -f
for i in $(find . -name '*.jpg'); do echo "$i"; done
তারপরে কেবল নিউলাইন চরিত্রগুলিই একটি সমস্যা।
আপনি ফাইলটির নাম পড়ার চেষ্টা করার সময় লোকেরা যে সমস্যার মুখোমুখি হয় সেগুলির মধ্যে একটি যা আপনি উল্লেখ করেছেন। কখনও কখনও, সীমিত জ্ঞানযুক্ত এবং ফাইল এবং ফোল্ডার কাঠামোর ভুল ধারণা থাকা লোকেরা " ইউনিক্স ইন সব কিছু একটি ফাইল " ভুলে যাওয়ার প্রবণতা পোষণ করে । সুতরাং তারা বুঝতে পারে না যে পাশাপাশি ফাঁকা স্থানগুলিও তাদের হ্যান্ডেল করা দরকার, কারণ ফাইলের নামটিতে স্পেস সহ 2 বা ততোধিক শব্দ থাকতে পারে।
সমাধান: সুতরাং এটি করার আরও একটি ভাল উপায় হল একটি পরিষ্কার পড়া ।
আমরা এখানে উপস্থিত সমস্ত ফাইলগুলি পড়ব এবং এগুলি একটি ভেরিয়েবলে রাখব, পরের বার যখন কাঙ্ক্ষিত প্রসেসিং করা হয় তখন আমাদের কেবলমাত্র সেই পরিবর্তনশীল কোটের ভিতরে রাখতে হবে যা ফাইলগুলির নাম ফাঁকা রেখে সংরক্ষণ করবে। এটি করার একটি প্রাথমিক উপায় এটি, তবে এখানকার অন্যান্য লোকদের দেওয়া অন্যান্য উত্তরগুলি ঠিক সেইভাবে কাজ করে।
লিপি :
find /path/to/files/ -iname "*jpg" | \
while read I; do
cp -v --parent "$I" /backup/dir/
done
এখানে আমি ফাইলগুলিকে তাদের পাথ দিয়ে পাঠ করছি এবং যা কিছু পড়ছি তা আমি তাদের একটি ভেরিয়েবলের মধ্যে রেখে দিচ্ছি, যা আমি স্থানটি সংরক্ষণের জন্য এটি প্রক্রিয়া করার সময় পরবর্তী সময়ে উদ্ধৃত করব যাতে এটি সঠিকভাবে প্রক্রিয়া করা যায়।
আশা করি এটি আপনাকে কোনওভাবে সহায়তা করবে।
কেবল সাথে find
এবং bash
:
find . -name '*.jpg' -exec bash -c '
echo "treating file $1 in bash, from path : ${1%/*}"
' -- {} \;
এইভাবে, আমরা ব্যবহার করি $1
কোনও বেসিক স্ক্রিপ্টের মতো ব্যাশে যা কোনও উন্নত (বা না) কার্য সম্পাদন করার জন্য সুন্দর দৃষ্টিভঙ্গি খোলে।
আরও কার্যকর উপায় (প্রতিটি ফাইলের জন্য নতুন বাশ শুরু করা এড়াতে):
find . -name '*.jpg' -exec bash -c 'for i do
echo "treating file $i in bash, from path : ${i%/*}"
done' -- {} +
ব্যাশের সাম্প্রতিক সংস্করণে, আপনি globstar
বিকল্পটি ব্যবহার করতে পারেন :
shopt -s globstar
for file in **/*.jpg ; do
echo "$file"
done
সাধারণ ক্রিয়াগুলির জন্য, আপনি এমনকি লুপটি পুরোপুরি এড়িয়ে যেতে পারেন:
echo **/*.jpg
set -G
) দিয়ে, এটি ব্যাশ ব্যবহার করা উচিত নয় কারণ বাশ সংস্করণটি মূলত ভাঙা হয় (ঠিক জিএনইউ এর মতো grep -r
) এটি ডিরেক্টরিতে চিহ্নগুলির ( যেমন সমেত find -L
বা zsh এর সমতুল্য) নেমে আসে ***/*.jpg
)। এছাড়াও এটি লক্ষ্য করুন যে এটির বিপরীতে এটি ডটফায়ালগুলি বাদ দেবে এবং ডটডিয়ারে নেমে যাবে না (ডিফল্টরূপে)।
$i
? আমি এটি করি এবং এটি ভাল কাজ করে। এই পদ্ধতির সাথে কিছু ভুল আছে?