* নিক্স ওয়ান-লাইনার: পুনরাবৃত্তভাবে এক্সটেনশান দ্বারা ফাইলগুলি সন্ধান করুন এবং সেগুলি এক্সটেনশনের নামে একটি নতুন ডিরেক্টরিতে অনুলিপি করুন


2

বিভিন্ন ডিরেক্টরি / উপ-ডিরেক্টরিতে বিভিন্ন ফাইল ধরণের (সিএসভি, টিএসটিএসটি, জেপিজি ইত্যাদি) দেওয়া, কোন নির্দেশটি প্রতিটি ডিরেক্টরি পুনরাবৃত্তভাবে অনুসন্ধান করবে এবং প্রতিটি এক্সটেনশানের নাম অনুসারে একটি নতুন শীর্ষ-স্তরের ডিরেক্টরিতে ফাইলগুলি অনুলিপি করবে।

ওয়ান-লাইনার দিয়ে এটি সম্পাদন করার কোনও উপায় আছে কি?


1
আপনার যে কমান্ডটি কল করা প্রয়োজন find। আপনি এটিকে ওয়ান-লাইনার হিসাবে তৈরি করতে পারেন
— অ্যালেক্স

কেন এটি এক লাইনে থাকতে হবে?
— শেঠ

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

উত্তর:


1

সমাধান

নিম্নলিখিত কমান্ডটি বর্তমান ডিরেক্টরি ( .) এর সমস্ত ফাইল তালিকাভুক্ত করবে এবং তাদের এক্সটেনশনের নাম অনুসারে ডিরেক্টরিগুলিতে স্থানান্তরিত করবে ./OUTPUT:

for file in $(find . -type f) ; do EXTENSION=$(echo "$file" |sed 's/.*\.//g') ; rsync -av $file ./OUTPUT/$EXTENSION/ ; done

উপরের কমান্ডটি চালানোর আগে আপনার প্রয়োজন হবে:

  • বর্তমান ডিরেক্টরিতে OUTPUT ডিরেক্টরি তৈরি করুন ( mkdir OUTPUT)
  • সাবডিরেক্টরিগুলির যে কোনও একটিতে নামের সাথে মিল থাকা কোনও ফাইল নেই তা নিশ্চিত করুন

ব্যাখ্যা

প্রথমত, লুপটি fileআউটপুট থেকে একটি ফাইলের সাথে ভেরিয়েবল বরাদ্দ করে find . -type f। findকমান্ডের উদাহরণ আউটপুট নীচে রয়েছে:

./a/myfile1.zip
./a/b/adoc1.txt
./a/b/adoc2.txt
./a/b/adoc3.txt
./a/b/adoc4.txt
./a/myfile3.zip
./a/myfile4.zip
./a/myfile2.zip

ভেরিয়েবলটি EXTENSIONতৈরি করা হয় এবং এর মান হ'ল fileসর্বশেষ স্টপ স্ট্রপ আউট অব স্ট্রিপ সহ সমস্ত কিছু দিয়ে ভেরিয়েবল। তাই ./a/myfile1.zipহয়ে যাবে zip।

তারপরে ফাইলটি এক্সটেনশনের নামে নামের vমধ্যে একটি ডিরেক্টরিতে (ভার্বোসিটি সহ ) সিঙ্ক করা OUTPUTহয়।

কিছু পরীক্ষায় এই আদেশটি চালানোর পরে আমার ফাইল ট্রিের একটি উদাহরণ:

./a
./a/b
./a/b/adoc1.txt
./a/b/adoc2.txt
./a/b/adoc3.txt
./a/b/adoc4.txt
./a/b/c
./a/myfile1.zip
./a/myfile2.zip
./a/myfile3.zip
./a/myfile4.zip
./b
./b/c
./b/c/d
./b/c/file1.txt
./b/c/file2.txt
./b/c/file3.txt
./b/c/file4.txt
./c
./c/d
./c/d/e
./c/d/e/afile1.rar
./c/d/e/afile2.rar
./c/d/e/afile3.rar
./c/d/e/afile4.rar
./OUTPUT
./OUTPUT/rar
./OUTPUT/rar/afile1.rar
./OUTPUT/rar/afile2.rar
./OUTPUT/rar/afile3.rar
./OUTPUT/rar/afile4.rar
./OUTPUT/txt
./OUTPUT/txt/adoc1.txt
./OUTPUT/txt/adoc2.txt
./OUTPUT/txt/adoc3.txt
./OUTPUT/txt/adoc4.txt
./OUTPUT/txt/file1.txt
./OUTPUT/txt/file2.txt
./OUTPUT/txt/file3.txt
./OUTPUT/txt/file4.txt
./OUTPUT/zip
./OUTPUT/zip/myfile1.zip
./OUTPUT/zip/myfile2.zip
./OUTPUT/zip/myfile3.zip
./OUTPUT/zip/myfile4.zip

0

এই সঙ্গে খুব সহজভাবে সম্পন্ন করা যেতে পারে খোঁজ , যেমন সঠিকভাবে অ্যালেক্স দ্বারা প্রস্তাবিত: সংগ্রহ অভিমানী ফাইল জন্য স্ক্যান করতে path1 / থেকে / / কিছু / Dir , এবং আপনি ফাইল সরানো চান / path2 / / অন্যান্য / Dir / টেক্সট থেকে এবং শীঘ্রই,

find /path1/some/dir -type f -exec bash -c 'MYDIR=/path2/to/other/dir${0##*.}; [ -d $MYDIR ] && mv $0 $MYDIR  || mv $0 /path3/to/miscellanea' {} \; 

এই কমান্ডটি প্রথমে ডিরেক্টরি / পথ 1 / to / কিছু / dir এবং এর সমস্ত উপ- ডিরেক্টরিতে অন্তর্ভুক্ত সমস্ত ফাইল ( -প্রকার চ ) খুঁজে বের করে , তারপর এই জাতীয় প্রতিটি ফাইলের ( {} ) নাম একটি ছোট বাশ দ্বি-লাইনারে প্রেরণ করে , যা প্রথমে ফাইলের নামটি ( ব্যাশের অভ্যন্তরে $ 0 হিসাবে উল্লেখ করা হয় ) থেকে এক্সটেনশনটি বের করে এবং এটি স্থানীয় শেল ভেরিয়েবল এমওয়াইডিআইআরকে নির্ধারণ করে , তারপরে উপযুক্ত ডিরেক্টরিটির অস্তিত্বের জন্য পরীক্ষা করে (যদি কোনও ডিরেক্টরি নেই, তবে সম্ভবত আমরা ভুল করেছি) , এবং যদি ডিরেক্টরিটি উপস্থিত থাকে ( && ... ) এটি ফাইলটিকে যথাযথ ডিরেক্টরিতে সরিয়ে দেয়, অন্যথায় ( || ... ) এটি ফাইলটিকে একটি ডিফল্ট জায়গায় রাখে, / পথ 3 / থেকে / বিবিধ।

উপরের দিক থেকে ধরে নেওয়া হয়েছে যে আপনি ইতিমধ্যে প্রয়োজনীয় ডিরেক্টরিগুলি, / পাথ 2 / থেকে / অন্যান্য / দির / টিএসটি এবং আরও তৈরি করেছেন। পরিবর্তে আপনি যদি সেগুলি চলতে শুরু করতে চান তবে আপনাকে উপরের হিসাবে এটি সংশোধন করতে হবে:

find /path1/some/dir -type f -exec bash -c 'MYDIR=/path2/to/other/dir/${0##*.}; mkdir -p $MYDIR && mv $0 $MYDIR' {} \; 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.