আমি কীভাবে সাব-ডাইরেক্টরিগুলিতে সমস্ত ফাইলকে একক ডিরেক্টরিতে পুনরাবৃত্তি করতে পারি?


10

আমি বর্তমান ডিরেক্টরিতে সমস্ত ফাইল এবং সমস্ত ডিরেক্টরিকে একটি ডিরেক্টরিতে সংগ্রহ করার চেষ্টা করছি। আমি নিম্নলিখিত মত কিছু চেষ্টা করছি

find -type f -exec mv {} collection/{} \; 

উপরের কমান্ডটি কাজ করবে না কারণ দ্বিতীয়টি {}পুরো পথ দেয়, আমি কীভাবে সমস্ত ফাইল সংগ্রহ করতে পারি?

উত্তর:


14

এর {}থেকে মুছে ফেলুন mv, mvএটি কোনও পিতামাতার ডিরেক্টরিকে অগ্রাহ্য করে লক্ষ্য ডিরেক্টরি হিসাবে গ্রহণ করবে:

find -type f -exec mv {} collection/ \;

ওহ যা আমার কাছে ঘটেনি। ধন্যবাদ :)
বনি খরগোশ

আমি আমার প্রশ্নের উত্তরে যেমনটি বলি, এটি সম্ভবত একটি খারাপ ধারণা। হতে পারে যুক্তিটি ব্যবহার করা -maxdepth 1সাহায্য করবে।
লোভবার্গ

ভাবতে আসুন, মনে হচ্ছে আপনার প্রশ্নটি ভুল পড়েছি :) দুঃখিত।
লোভবার্গ

@ ল্যাভবার্গ: আমি এখন শিরোনামে "পুনরাবৃত্তভাবে" যুক্ত করেছি। যদি এখনও বিভ্রান্তি থেকে থাকে তবে দয়া করে এটিকে সম্পাদনা করুন এবং এটি উন্নত করুন :)
লেকেনস্টেইন

1
এই উত্তরের একটি দ্রুততম পরিবর্তনটি হলfind -type f -print0|xargs -0r mv -it colection/
হিলার্ড করা

5

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অর্থ "ডটফাইলগুলিও নির্বাচন করুন"; এর .অর্থ "কেবল নিয়মিত ফাইল নির্বাচন করুন, ডিরেক্টরি নয়"।


ভাল, আমি সমস্ত উপ-ডিরেক্টরিতেও পুনরাবৃত্তি করতে চেয়েছিলাম, তবে তথ্যটি যে কোনও উপায়ে কার্যকর হবার জন্য ধন্যবাদ, এই পরিস্থিতিটি অনেক বার আসুন :)
বনি রাবিট

প্রকৃতপক্ষে, এটির জন্য ওভারকিল নয়, গ্লোব্বিং শুধুমাত্র ফাইল নয়, ডিরেক্টরিগুলিও সমস্ত ম্যাচ নির্বাচন করবে। আপনি যদি কর্মক্ষমতা চলেছেন উদ্বেগ, আপনার কাছে ভালো কিছু ব্যবহার করতে পারে: find -type f -exec mv -t collection/ {} +। এটি কীভাবে কাজ করে তার ম্যানুয়াল পৃষ্ঠায় পরামর্শ করুন।
লেকেনস্টেইন

লেকেনস্টেইন, আপনি ঠিক বলেছেন। আমি উত্তরটি এখনই আপডেট করেছি যে আমি প্রশ্নটি বুঝতে পেরেছি।
loevborg

2
আশ্চর্যজনক উত্তর, খুব খারাপ যে এটি প্রশ্নের সাথে বিশেষভাবে প্রাসঙ্গিক নয় :)।
পাগল 2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.