find
(যা কাজটি ভাল করে) ব্যবহার করার পরিবর্তে , আপনি এই প্রান্তে শেলটিও ব্যবহার করতে পারেন।
বলুন আপনি files PWD থেকে $ DEST এ সমস্ত ফাইল চান। প্রাকৃতিক প্রচেষ্টা হবে:
mv $PWD/* $DEST
কিভাবে কাজ করে? "$ PWD / *" এক্সপ্রেশনটি সেই ডিরেক্টরিতে সমস্ত ফাইলের নামের সাথে প্রসারিত হয়। এই শেল বৈশিষ্ট্যটিকে "গ্লোব্বিং" বলা হয়। এর সর্বশেষ যুক্তি mv
হ'ল গন্তব্য ডিরেক্টরি। আপনার যদি খুব বেশি ফাইল থাকে তবে এটি কাজ করবে না কারণ কমান্ড লাইনের দৈর্ঘ্য সীমিত।
তবে সমাধানটিতে সমস্যা রয়েছে যে এটি ডট ফাইলগুলি বাদ দেয় - বা "লুকানো" ফাইল, ফাইল এবং ডিরেক্টরি যার নাম একটি "দিয়ে শুরু হয়"। এটি সমাধান করার জন্য, আপনার শেলটি গ্লোব্বিংয়ের সময় ডটফাইলস অন্তর্ভুক্ত করতে আপনাকে বলতে হবে। এটি করতে, ব্যবহার করুন
shopt -s dotglob
ব্যবহার করার সময় bash
(এবং আপনি সম্ভবত bash
ডিফল্টটি পরিবর্তন না করে ব্যবহার করেন)। এই শেলটিতে উপরের কমান্ডটি ডটফাইলগুলির জন্যও কাজ করবে।
একদিকে যেমন, zsh
কেস-কেস-কেস ভিত্তিতে আপনার এটি বেছে নেওয়ার বিকল্প রয়েছে। এটি করতে, রাখুন
setopt extendedglob
আপনার .zshrc
। তারপরে আপনি ব্যবহার করতে পারেন
mv $PWD/*(D) $DEST
ডটফাইলস সহ সমস্ত ফাইল সরিয়ে নিতে। ("ডি" এর "GLOB_DOTS" বিকল্পটি সাময়িকভাবে সক্ষম করার প্রভাব রয়েছে)।
এখন আসল প্রশ্নটি ছিল সমস্ত নিয়মিত ফাইল (ডিরেক্টরি নয়) সমস্ত উপ-ডিরেক্টরি এবং তাদের উপ-ডিরেক্টরি থেকে একটি একক ডিরেক্টরিতে to এটি দিয়ে সম্পন্ন করা যেতে পারে zsh
:
mv $PWD/**/*(D.)
এখানে অভিব্যক্তিটি **/*
গ্লোবারকে উপ-ডিরেক্টরিতে পুনরাবৃত্তভাবে নেমে আসে। এর D
অর্থ "ডটফাইলগুলিও নির্বাচন করুন"; এর .
অর্থ "কেবল নিয়মিত ফাইল নির্বাচন করুন, ডিরেক্টরি নয়"।