আপনি কীভাবে একটি নির্দিষ্ট ধরণের সমস্ত ফাইল ইউনিক্সের ডিরেক্টরিতে স্থানান্তর করতে পারেন (বা অনুলিপি করতে পারেন)?


22

আমি grep/find/awk/xargsএখনও বেশিরভাগ কৌশল সম্পর্কে খুব বেশি পরিচিত নই ।

বলুন, আমার একটি নির্দিষ্ট প্যাটার্নের সাথে মেলে কিছু ফাইল রয়েছে *.xxx। এই ফাইলগুলি একটি নির্দিষ্ট ডিরেক্টরি জুড়ে এলোমেলো জায়গায় থাকে। আমি কীভাবে এই জাতীয় সমস্ত ফাইল সন্ধান করব এবং তাদের ইউনিক্সের হোম ডিরেক্টরি ডিরেক্টরিতে একটি ফোল্ডারে স্থানান্তরিত করব (এটি এখনও বিদ্যমান নেই)?


4
"ফাইলের ধরণ" সম্পর্কে কথা বলার সময় আপনাকে যত্ন নিতে হবে। ইউনিক পরিবেশে, ".xxx" উদাহরণটি উইন্ডোজ অর্থে কোনও এক্সটেনশনও নয়। ".xxx" ফাইলের নামের একটি প্রত্যয় গঠন করে। "ফাইলের ধরণ" কয়েকটি বিভাগের মধ্যে আরও একটি: নিয়মিত ফাইল, ডিভাইস ফাইল, প্রতীকী লিঙ্ক, ডিরেক্টরি, নামযুক্ত পাইপ, ইউনিক্স-পারিবারিক সকেট, সম্ভবত আরও কয়েকটি others
ব্রুস এডিগার


@ ব্রুস এডিগার ধন্যবাদ আমার ধারণা আমি আসলে "ফাইলের নাম ধরণ" বলতে
চাইছিলাম

উত্তর:



17

আপনি যদি ডিরেক্টরি হায়ারার্কির সমস্ত ফাইল একটি একক গন্তব্য ডিরেক্টরিতে বাশ ≥4 ( shopt -s globstarআপনার মধ্যে রাখুন ~/.bashrc) বা zsh তে সরিয়ে নিতে চান:

mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory

অন্যান্য শেলগুলিতে:

mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;

এই findআদেশটি কীভাবে পড়বেন :

  • .: বর্তমান ডিরেক্টরিটি অতিক্রম করুন
  • -name '*.xxx': এই নামগুলির সাথে এই নামগুলির সাথে মেলে এমন ফাইলগুলিতে কাজ করুন
  • -exec … \;: প্রতিটি ফাইলে এই কমান্ডটি সম্পাদন করুন, ফাইলের {}পাথের পরিবর্তে

আরও জটিল কমান্ড রয়েছে যা findএটি দ্রুত ব্যবহার করে যদি আপনার অনেকগুলি ফাইল থাকে তবে mvপ্রতিটি ফাইলের জন্য পৃথক প্রক্রিয়া শুরু করার প্রয়োজন নেই :

find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +

+শেষে বলে findএকটি সময়ে একাধিক ফাইল কমান্ড ডাকা। যেহেতু findকেবলমাত্র কমান্ড লাইনের শেষে ফাইলের নাম রাখা mvযেতে পারে এবং গন্তব্য ডিরেক্টরিটি সর্বশেষে থাকা দরকার তাই আমরা আর্গুমেন্টগুলি পুনরায় সাজানোর জন্য একটি মধ্যবর্তী শেল ব্যবহার করি ( "$0"শেলের প্রথম আর্গুমেন্ট ~/new-directory, এবং "$@"পরবর্তী যুক্তিগুলি থেকে আসে findএর সম্প্রসারণ {})।


4

আপনি যদি নতুন টার্গেট ডিরেক্টরিতে মিলে যাওয়া উত্স ফাইলগুলির ডিরেক্টরি কাঠামোটি প্রতিলিপি করতে চান তবে আপনি GNU cp এর --parents বিকল্পটি ব্যবহার করতে পারেন :

mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +

3

তোমাকে ছাড়া খোঁজ ব্যবহার করতে পারেন -exec‍পাশাপাশি:

mkdir /path/to/dest    
cp `find /path/to/source -name "*.jar"` /path/to/dest

1
নোট তবে এটি find -execঅনেক নিরাপদ; উদাহরণস্বরূপ, সাদা স্থানযুক্ত ফাইলের নামগুলিতে উপরেরগুলি ব্যর্থ হবে।
ধাগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.