স্পেসিফিক নামের নিদর্শন সহ কয়েক মিলিয়ন ফাইলকে আলাদা ডিরেক্টরিতে সরানো


10

লিনাক্স মেশিনে নিম্নলিখিত নামকরণ সহ আমার কয়েক মিলিয়ন ফাইল রয়েছে:

1559704165_a1ac6f55fef555ee.jpg

প্রথম 10 টি সংখ্যা টাইমস্ট্যাম্প এবং এর পরে একটি _নির্দিষ্ট আইডি হয়। আমি নির্দিষ্ট ফাইল নাম আইডির সাথে মিলে থাকা সমস্ত ফাইলকে একটি আলাদা ফোল্ডারে নিয়ে যেতে চাই।

আমি ফাইলের সাহায্যে ডিরেক্টরিতে এটি চেষ্টা করেছি

find . -maxdepth 1 -type f | ??????????_a1ac*.jpg |xargs mv -t "/home/ubuntu/ntest"

তবে আমি ইঙ্গিত করে একটি ত্রুটি পাচ্ছি:

bash 1559704165_a1ac6f55fef555ee.jpg: command not found

যখন আমি চেষ্টা করেছি, mv ??????????_a1ac*.jpg আমি যুক্তি তালিকার খুব দীর্ঘ ত্রুটি পাচ্ছি। আমার কমপক্ষে 15 টি পৃথক ফাইলের নাম রয়েছে। আমি কীভাবে তাদের সরিয়ে নিই।


1
বাশ এটি সব বলে: এটি পাইপটির ২ য় পর্যায়ে লাইনটিতে প্রথম হওয়ায় ফাইল ফাইলটি কার্যকর করতে চেষ্টা করে (আপনার দ্বিতীয় স্তরের পাইপটি | ??????????_a1ac*.jpg:: ব্যাশ এটি বেশ কয়েকটি ফাইলের নাম, প্রথমটি, প্রসারিত করে 1559704165_a1ac6f55fef555ee.jpg, আপনি শেষ করেছেন) , ২ য় পাইপ পর্যায়ে, মৃত্যুদন্ড কার্যকর করার চেষ্টা করছে: 1559704165_a1ac6f55fef555ee.jpg next_matching_filename 3rd_matching_filename ... nth_matching_filenameআমার ধারণা আপনি সেই ফাইলের
নামটি

উত্তর:


15

আপনার ব্যবহার করা উচিত:

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' \
-exec mv -t destination "{}" +

এর maxdepth 1অর্থ আপনি বর্তমান ডিরেক্টরিতে কোনও উপ-ডিরেক্টরিতে সন্ধান করতে চান।

type f মানে কেবল ফাইলগুলি সন্ধান করুন।

name '??????????_a1ac*.jpg' এমন একটি প্যাটার্ন যা আপনার সন্ধান করা ফাইলের সাথে মেলে।

mv -t destination "{}" +মানে ম্যাচ করা ফাইলগুলি গন্তব্যে নিয়ে যাওয়া। এখানে +আগেরগুলির মতো নতুন ম্যাচ করা ফাইল যুক্ত করা হয়েছে:

mv -t dest a b c d

এখানে abcd বিভিন্ন ফাইল আছে।


এই ব্যক্তিদের প্রশ্নের সংক্ষিপ্ত উত্তর দেওয়ার জন্য ধন্যবাদ। কেবল সমাধান সমাধানের পরিবর্তে আপনি কীভাবে / কীভাবে / কেন তা ব্যাখ্যা করতে পারেন explain এক সময় এক ব্যক্তির উপকারী হওয়ার পরিবর্তে, এটি সর্বদা কার্যকর হতে পারে। গত 40-50 বছর ধরে একই প্রশ্ন জিজ্ঞাসা করা হয়েছে এবং অসংখ্যবার উত্তর দেওয়া হয়েছে। সমস্যাটি হচ্ছে, এটি কখনই ভালভাবে ব্যাখ্যা করা যায় না। একজন মানুষকে মাছ ধরতে শেখান .. এর মধ্যে: gnu.org/software/findutils/manual/html_node/find_html/… এবং প্রায়শই সরকারী ডক্সের চেয়ে উইকিপিডিয়া বেশি কার্যকর: en.wikedia.org/wiki/Find_ ( ইউনিক্স)
মতামত

আপডেট উত্তর দেখুন।
প্রাইভেট_যাদভ

নোট যে -tএকটি GNU এক্সটেনশান এবং তাই অন্যান্য ধরণের UNIX ডেরিভেটিভসে উপলব্ধ নাও হতে পারে।
কেভিন

আপনি যখন বলেন "ডাবল উদ্ধৃতি শব্দের বিভাজন রোধ করে।" আমি অনুমান করছি আপনি উল্লেখ করছেন "{}", সেই ক্ষেত্রে আমি এটি উল্লেখ করতে চাই যা {}শেল দ্বারা প্রসারিত নয় এবং উদ্ধৃত করার দরকার নেই। শেলটি সন্ধান {}করার জন্য পাস করে, এবং এটি সন্ধান করে এবং এটি নামের {}সাথে প্রতিস্থাপন করে। এক্সিকিউট অনুসন্ধান করুন শেল পার্সার ব্যবহার করে না এবং নিজস্ব কোনও শব্দ-বিভাজনও করে না। এটিকে উদ্ধৃত করে কোনও ক্ষতি হয় না, এটি দেওয়া ন্যায়সঙ্গতটি কিছুটা ভুল।
jw013

@ jw013 ধন্যবাদ।
প্রাইভেট_যাদভ

11

আপনার আদেশ,

find . -maxdepth 1 -type f | ??????????_a1ac*.jpg |xargs mv -t "/home/ubuntu/ntest"

সমস্ত ফাইলের সমস্ত ফাইলের তালিকা পাইপগুলি!

find . -maxdepth 1 -type f -name `*_a1ac*.jpg` -print0 |\
xargs  -0 -r mv -t "/home/ubuntu/ntest"

কৌতুক করবে


1
অনেক ধন্যবাদ ... আপনার সমাধানটিও কার্যকরভাবে কাজ করেছে ... আমি কোথায় ভুল করেছি তা আমাকে জানানোর জন্য আপনাকে ধন্যবাদ
এপ্রিকট

8

আপনি খুব কাছের। আপনার -nameবিকল্পটি ব্যবহার করা উচিত find। এবং প্যাটার্ন উদ্ধৃতি মনে রাখবেন।

সুতরাং

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' |xargs mv -t "/home/ubuntu/ntest"

অনেক ধন্যবাদ ... আপনার সমাধানটিও কার্যকরভাবে কাজ করেছে .... আমাকে সমাধানের কাছাকাছি আসার জন্য অতিরিক্ত ধন্যবাদ .... এটি আমার মতো নবজাতকের জন্য প্রেরণা
এপ্রিকট

1
আপনার -print0সন্ধানে সর্বশেষ যুক্তি হিসাবে যুক্ত করা উচিত (ডিফল্ট: -প্রিন্টের পরিবর্তে), এবং -0xargs এ প্রথম বিকল্প হিসাবে যুক্ত করুন (অর্থাত xargs -0 mv -t "/home/ubuntu/ntest":)। এইভাবে, সমস্ত ধরণের অদ্ভুত ফাইলের নাম (এটির সাথে ফাঁকা স্থান, "নিউলাইন" সহ, ইত্যাদি) পরিচালনা করা যায়। find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' -print0 |xargs -0 mv -t "/home/ubuntu/ntest" (যদিও শুধুমাত্র জিএনইউ-এর মতো
সন্ধানের

2

findসমাধানগুলির মতো "ভাল" নয়, তবে আরও একটি কার্যকর সমাধান হ'ল mvআদেশগুলি আরও দানাদার করা।

এটি mvঅপারেশন প্রতি কয়েকটি সংখ্যক ফাইল সরিয়ে নিয়ে 4096 চালনা করে।

FILEPAT=a1ac
for i in $(seq $((0x000)) $((0xfff))); 
do 
   H=$(printf '%x\n' $i)
   mv 1559704165_${FILEPAT}${H}*.jpg /home/ubuntu/ntest
done

এটি তাদের জন্য একটি চালাক হ্যাক findwhatever
বন

-1

আপনি একই হোস্ট সিস্টেম, যা আমি আপনার করছেন ফাইল স্থানান্তর করতে চান তাহলে mv, rsyncএকটি দ্রুত বিকল্প হতে পারে:

rsync -av --inplace -W /source/??????????_a1ac*.jpg /home/ubuntu/ntest/

--inplaceএবং -Wপ্রক্রিয়াটির গতি বাড়ানোর জন্য প্রস্তুত রয়েছে।

এটিতে যদি আর কোনও যুক্তি তালিকার খুব দীর্ঘ ত্রুটি পাওয়া যায় তবে আপনি তালিকাগুলিতে ফিড দিতে পারেনrsync

উদাহরণস্বরূপ অনুসন্ধানের সাথে তালিকা তৈরি করুন

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' > /tmp/my_image_list.txt

এবং এটি দিতে rsync

rsync -av --inplace -W --files-from=/tmp/my_image_list.txt /path/to/files /home/ubuntu/ntest/

এখানে উত্সটি হ'ল /path/to/filesকারণ rsyncআপনি যে উত্সটি দিয়েছেন তা আপনার উত্সের সাথে তুলনামূলকভাবে আচরণ করবে।


বিন্দু হচ্ছে: rsyncদ্রুততর চেয়ে mv, যদি ফাইল একই ফাইলসিস্টেম এ নেই


এটি একই "আর্গুমেন্টের তালিকা খুব দীর্ঘ" ত্রুটিতে আঘাতের সম্ভাবনা রয়েছে যা ওপি উল্লিখিত হয়েছে
গ্রাম্প

@ গ্র্যাম্প, এড়াতে ওপি কোনও ফাইলের অনুলিপি করার জন্য ফাইলগুলির তালিকা লিখতে পারে, find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' > /tmp/my_image_list.txtএবং তারপরে এটি আরএসসিএনকে পাস করতে পারে --files-from=/tmp/my_image_list.txt। পয়েন্ট হচ্ছে যে rsyncদ্রুত। যদি না ফাইলগুলি একই ফাইল সিস্টেমে না থাকে, যা ওপি নির্দেশ করে না।
রবার্ট রিডেল

@ রবার্টরিডেল: আপনার নিজের উত্তরটি সম্পাদনা করে এই তথ্যটি যুক্ত করা উচিত। মন্তব্যগুলি স্থায়ী হতে পারে।
নিকড

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