আমার বেশ কয়েকটি ডিরেক্টরিতে জিপ ফাইল রয়েছে:
Fol1/Fol2
Fol3
Fol4/Fol5
আমি কীভাবে তাদের সকলকে একটি সাধারণ বেস ফোল্ডারে স্থানান্তরিত করব?
আমার বেশ কয়েকটি ডিরেক্টরিতে জিপ ফাইল রয়েছে:
Fol1/Fol2
Fol3
Fol4/Fol5
আমি কীভাবে তাদের সকলকে একটি সাধারণ বেস ফোল্ডারে স্থানান্তরিত করব?
উত্তর:
জিপ ফাইল ( cd …
)যুক্ত গাছের শীর্ষ স্তরের ডিরেক্টরিতে যান , তারপরে চালান
mv **/*.zip /path/to/single/target/directory
এটি zsh এর বাক্সের বাইরে কাজ করে। যদি আপনার শেলটি বাশ হয় তবে আপনাকে shopt -s globstar
প্রথমে চালানো দরকার (আপনি এই কমান্ডটি নিজের মধ্যে রেখে দিতে পারেন এবং করতে পারেন ~/.bashrc
)। যদি আপনার শেলটি ksh হয় তবে আপনাকে set -o globstar
প্রথমে চালানো দরকার (এটি আপনার মধ্যে দিন ~/.kshrc
)।
বিকল্পভাবে, ব্যবহার করুন find
, যা কোনও বিশেষ প্রস্তুতি ছাড়াই সর্বত্র কাজ করে তবে আরও জটিল:
find . -name '*.zip' -exec mv {} /path/to/single/target/directory \;
আপনি যদি পরে খালি ডিরেক্টরিগুলি সরাতে চান তবে zsh:
rmdir **/*(/^Fod)
বাশ বা কেশে:
rmdir **/*/
এবং অপসারণের জন্য খালি ডিরেক্টরি রয়েছে যতক্ষণ না পুনরাবৃত্তি করুন। বিকল্পভাবে, যে কোনও শেলের মধ্যে
find . -depth -type d -empty -exec rmdir {} \;
find
উপরের প্রথম কমান্ডটি ব্যাশে কাজ করেছে, তবে find . -name
এটির কাজ পেতে এটিতে পরিবর্তন করতে হয়েছিল ।
.
জিএনইউ অনুসন্ধানের জন্য অন্তর্ভুক্ত তবে অন্যের পক্ষে নয়, আমি এটি স্পষ্টভাবে যুক্ত করেছি added
আপনি যদি কেবল .zip
ফাইলগুলি সরাতে চান তবে আপনি এমন কিছু করতে পারেন
mkdir ./zipfiles
find . -name "*.zip" -exec mv "{}" ./zipfiles \;
আপনি যদি বাশ সংস্করণ 4 বা তার বেশি বা zsh ব্যবহার করছেন তবে আপনি পুনরাবৃত্ত গ্লোববিং ব্যবহার করতে পারেন:
mv **/*.zip /path/to/move/zip/files/to
এটি কেবলমাত্র ফাইলগুলিতে সরবে এবং তাদের আপেক্ষিক পথ নয়, যাতে সংঘর্ষের ঘটনা ঘটতে পারে।
ডেটা এবং ত্রুটি মুক্ত স্থানান্তরিত করার সময় এইটি নিরাপদ যা সমস্ত ডিস্ট্রো নির্বিশেষিত সংস্করণকে সমর্থন করে। এই কমান্ডটি উপ-ডিরেক্টরিগুলি স্ক্যান করবে এবং তারপরে আপনার নতুন গন্তব্য ডিরেক্টরিতে স্থানান্তরিত বা অনুলিপি করবে।
find . -name *.flac -exec mv '{}' "./flac/" ";"
*.flac
যেমন পরিবর্তন করতে পারেন *.zip
। অথবা *.doc
কেবল কোনও এক্সটেনশন কাজ করে।mv
ফাইলগুলি সরানোর আদেশ হ'ল বা আপনি cp
সরানোর পরিবর্তে ডেটা অনুলিপি করতে ব্যবহার করতে পারেন ।./flac/
গন্তব্য ডিরেক্টরি যা আমি সমস্ত এফএলসি ফাইলগুলিতে সরাতে চাই। আপনি এটির মতো একটি পুরো পথও দিতে পারেন/home/myid/flac/
পুরো উদাহরণ। (এই ক্ষেত্রে, সংগীত শিল্পীর নাম সহ অনেকগুলি উপ-ডিরেক্টরি রয়েছে /home/myid/Music/
এবং তারপরে এফএলএসি ফাইলগুলি সমস্ত পৃথক উপ-ডিরেক্টরিগুলির স্তরে রয়েছে level যেহেতু আমার পক্ষে শিল্পী ফোল্ডারগুলির প্রয়োজন নেই তবে সমস্ত এফএলএসি ফাইলগুলি একটি ডিরেক্টরিতে থাকতে চান)/home/myid/Music/flac/
cd /home/myid/Music
mkdir flac
find . -name *.flac -exec mv '{}' "./flac/" ";"
cd flac
ls
তারপরে এটি সমস্ত এফএলসি ফাইল প্রদর্শন করবে।
;
?
বাশ হ্যাক হিসাবে, আপনি এর শক্তি ব্যবহার করতে পারেন tar
:
(cd origin/;find . -exec file --mime-type "{}" \;|grep "application/zip"|cut -d ':' -f 1|xargs tar cf -)|(cd target/; tar xf -) && rm -fr origin/
এর সুবিধা রয়েছে যে এটি ফাইল এক্সটেনশনের উপর নির্ভর করে না, যেহেতু এটি file
ফাইলগুলি সরানোর জন্য কমান্ডটি ব্যবহার করে এবং এটি ডিরেক্টরি কাঠামো সংরক্ষণ করে, তবে এটি ফাঁকা স্থানগুলির সাথে কাজ করে না।
চূড়ান্তটি কেবল rm
আসল ফাইলগুলি সরিয়ে দেওয়ার জন্য রয়েছে (বোকাউজ @ ইনকিলাইনকি জানিয়েছেন যে তিনি মন্তব্যে মূল ফোল্ডারটি সম্পর্কে চিন্তা করেন না)।
উত্স / এবং লক্ষ্য / ফোল্ডারগুলি বিভিন্ন ডিস্কে থাকলে অবশ্যই এটি বিশেষভাবে উপযুক্ত। অন্যথায় প্রস্তাবিত অন্যান্য সমাধানগুলি আরও কার্যকর (যদিও তারা file
বিষয়বস্তুর পরিবর্তে নামকরণের কনভেনশনে নির্ভর করে )।
ধরে নিলাম আপনার কাছে অনুসন্ধান এবং এমভি এর GNU সংস্করণ রয়েছে, নিম্নলিখিতটি অনুসন্ধান-ভিত্তিক উত্তরগুলির চেয়ে আরও কার্যকর হবে:
find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +
+
ফাইন্ড-এক্সেকের শেষে একটি ব্যবহার করার অর্থ ফাইলগুলির প্রতি এমভি কমান্ড নির্বাহের পরিবর্তে ফাইলগুলির একটি তালিকা এমভি কমান্ডের কাছে প্রেরণ করা হবে। তবে এর একটি সীমাবদ্ধতা হ'ল আপনি কেবলমাত্র কমান্ডের শেষে '{}' রাখতে পারবেন, এটি এমভি - স্টেট-ডিরেক্টরি বিকল্পটি ব্যবহারের প্রয়োজন, এবং যতদূর আমি জানি যে এটি জিএনইউ-ইস্ম।