একাধিক উপ-ডিরেক্টরি থেকে একটি এক্সটেনশান সহ সমস্ত ফাইলকে একটি ডিরেক্টরিতে সরান


43

আমার বেশ কয়েকটি ডিরেক্টরিতে জিপ ফাইল রয়েছে:

Fol1/Fol2
Fol3
Fol4/Fol5

আমি কীভাবে তাদের সকলকে একটি সাধারণ বেস ফোল্ডারে স্থানান্তরিত করব?


আপনি কি ডিরেক্টরি কাঠামো রাখতে চান? আপনি ডিরেক্টরিগুলি সরাতে চান, বা কেবল জিপ ফাইলগুলি?
জর্দানম

আমি কেবল জিপ ফাইলগুলি সরাতে চাই। আমি ডিরেক্টরিগুলির সত্যই যত্ন করি না - সেগুলি একা ছেড়ে দেওয়া বা মোছা যেতে পারে।
ইনকুইলাইনকিয়ার

উত্তর:


55

জিপ ফাইল ( 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এটির কাজ পেতে এটিতে পরিবর্তন করতে হয়েছিল ।
জেফ থমসন

1
@ জেফ .জিএনইউ অনুসন্ধানের জন্য অন্তর্ভুক্ত তবে অন্যের পক্ষে নয়, আমি এটি স্পষ্টভাবে যুক্ত করেছি added
গিলস 'অশুভ হওয়া বন্ধ করুন'

13

আপনি যদি কেবল .zipফাইলগুলি সরাতে চান তবে আপনি এমন কিছু করতে পারেন

mkdir ./zipfiles
find . -name "*.zip" -exec mv "{}" ./zipfiles \;

3

আপনি যদি বাশ সংস্করণ 4 বা তার বেশি বা zsh ব্যবহার করছেন তবে আপনি পুনরাবৃত্ত গ্লোববিং ব্যবহার করতে পারেন:

mv **/*.zip /path/to/move/zip/files/to

এটি কেবলমাত্র ফাইলগুলিতে সরবে এবং তাদের আপেক্ষিক পথ নয়, যাতে সংঘর্ষের ঘটনা ঘটতে পারে।


আপেক্ষিক পথ বলতে কী বোঝ?
কুনোক

2

ডেটা এবং ত্রুটি মুক্ত স্থানান্তরিত করার সময় এইটি নিরাপদ যা সমস্ত ডিস্ট্রো নির্বিশেষিত সংস্করণকে সমর্থন করে। এই কমান্ডটি উপ-ডিরেক্টরিগুলি স্ক্যান করবে এবং তারপরে আপনার নতুন গন্তব্য ডিরেক্টরিতে স্থানান্তরিত বা অনুলিপি করবে।

find . -name *.flac -exec mv '{}' "./flac/" ";"
  • আপনি যে ফাইলটি স্থানান্তর করতে চান সেগুলি সহ ডিরেক্টরিতে এই ডিরেক্টরিটি চালান that
  • যেখানে আপনি আপনার ক্ষেত্রে *.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

তারপরে এটি সমস্ত এফএলসি ফাইল প্রদর্শন করবে।



@ ফ্রান্সেসকোবাই একই লাইনে ব্যাশ কমান্ডের কাজ শেষ না হওয়া পর্যন্ত অপেক্ষা করা নিশ্চিত করে। এবং তারপরে bash কমান্ডের পরবর্তী লাইনে যান। এটি .pl বা পাইথনের মতো স্ক্রিপ্ট ধারণকারী কমান্ডগুলির জন্য দরকারী কারণ বাশ কেবল এটি চালাবে এবং তারপরে পরবর্তী লাইনে ঝাঁপিয়ে যাবে, তাই নিরাপদ থাকতে আমি ব্যবহার করি; কমান্ডগুলির পরে সময় বা স্ক্রিপ্ট লাগে, যদি বাশ এড়িয়ে যায়।
Seandex

0

বাশ হ্যাক হিসাবে, আপনি এর শক্তি ব্যবহার করতে পারেন 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বিষয়বস্তুর পরিবর্তে নামকরণের কনভেনশনে নির্ভর করে )।


0

ধরে নিলাম আপনার কাছে অনুসন্ধান এবং এমভি এর GNU সংস্করণ রয়েছে, নিম্নলিখিতটি অনুসন্ধান-ভিত্তিক উত্তরগুলির চেয়ে আরও কার্যকর হবে:

find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +

+ফাইন্ড-এক্সেকের শেষে একটি ব্যবহার করার অর্থ ফাইলগুলির প্রতি এমভি কমান্ড নির্বাহের পরিবর্তে ফাইলগুলির একটি তালিকা এমভি কমান্ডের কাছে প্রেরণ করা হবে। তবে এর একটি সীমাবদ্ধতা হ'ল আপনি কেবলমাত্র কমান্ডের শেষে '{}' রাখতে পারবেন, এটি এমভি - স্টেট-ডিরেক্টরি বিকল্পটি ব্যবহারের প্রয়োজন, এবং যতদূর আমি জানি যে এটি জিএনইউ-ইস্ম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.