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


111

ইউনিক্সের অধীনে, আমি সমস্ত ফাইলকে একটি উপ-ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে একটি নির্দিষ্ট এক্সটেনশন (সমস্ত এক্সেল ফাইল) কপি করতে চাই। আমার নিম্নলিখিত আদেশ আছে:

cp --parents `find -name \*.xls*` /target_directory/

এই আদেশের সাথে সমস্যাগুলি হ'ল:

  • এটি ডিরেক্টরি কাঠামোটিও অনুলিপি করে এবং আমি কেবল ফাইলগুলি চাই (সুতরাং সমস্ত ফাইল / টার্গেট_ডাইরেক্টরি / এ শেষ হওয়া উচিত)

  • এটি ফাইলের নামের ফাঁকা জায়গাগুলির সাথে ফাইলগুলি অনুলিপি করে না (যা বেশ কয়েকটি)

এই সমস্যার কোন সমাধান?



উত্তর:


173

--parents ডিরেক্টরি কাঠামো অনুলিপি করছে, সুতরাং আপনার এ থেকে মুক্তি পাওয়া উচিত।

আপনি এই লিখিত করেছি, find, executes এবং আউটপুট কমান্ড লাইন যেমন যে সম্মুখের রাখা হয় cpফাইলের নামের পৃথক স্পেস, এবং স্পেস মধ্যে পার্থক্য করতে পারে না মধ্যে ফাইলের নাম। এরকম কিছু করা ভাল

$ find . -name \*.xls -exec cp {} newDir \;

যার মধ্যে cpপ্রতিটি ফাইলের নাম নির্ধারিত হয় যা findখুঁজে পায় এবং ফাইল নামটি সঠিকভাবে পাস করে। এই কৌশল সম্পর্কে আরও তথ্য এখানে

উপরের সমস্তটির পরিবর্তে, আপনি zsh ব্যবহার করতে পারেন এবং কেবল টাইপ করতে পারেন

$ cp **/*.xls target_directory

zsh উপ-ডিরেক্টরি অন্তর্ভুক্ত করতে ওয়াইল্ডকার্ডগুলি প্রসারিত করতে পারে এবং এই ধরণের জিনিসটিকে খুব সহজ করে তোলে।


2
হ্যাঁ. 'বিন ইট' এর অর্থ এটি ফেলে দেওয়া। এখন সংশোধন করা হয়েছে :-)
ব্রায়ান অ্যাগনিউ

13
Bash4.0+ এবং ksh93সমর্থন করে **। ব্যাশের জন্য, shopt -s globstarএটি সক্ষম করতে ব্যবহার করুন । Ksh এর জন্য, এটি set -Gবা set -o globstar
পাইনেজজ

2
@ ড্যারিল - আমি আরও পূরণ করেছি। তবে উত্তরটি ইতিমধ্যে 'স্বীকৃত' হিসাবে চিহ্নিত হয়েছে, দ্রষ্টব্য
ব্রায়ান অগ্নিউ

5
এক্সিআরজে যাওয়ার চেয়ে টেকনিক্যালি এ এক্সিকিউট কম দক্ষ, যা সম্ভব যত কম সিপি কলগুলিতে এটি করা সম্ভব হবে: find . -name '*.xls' -print0 | xargs -0 cp -t destdir
তাইউই

2
@ ব্রায়ান অ্যাগনিউ ওহ, আমি নিশ্চিত, বাহ্যিক গুগলদের মন্তব্যে অতিরিক্ত তথ্য পাওয়া ঠিক আছে।
তাইউই

37

উপরের সমস্তটি থেকে, আমি এই সংস্করণটি নিয়ে এসেছি। এই সংস্করণটি ম্যাক রিকভারি টার্মিনালে আমার জন্যও কাজ করে।

find ./ -name '*.xsl' -exec cp -prv '{}' '/path/to/targetDir/' ';'

এটি বর্তমান ডিরেক্টরিতে এবং xsl এক্সটেনশান সহ ফাইলগুলির জন্য সমস্ত সাব ডিরেক্টরিতে পুনরাবৃত্তভাবে অনুসন্ধান করবে। এটি লক্ষ্য ডিরেক্টরিতে তাদের সমস্ত অনুলিপি করবে।

সিপি পতাকাগুলি হ'ল:

  • পি - ফাইলের বৈশিষ্ট্য সংরক্ষণ করুন
  • r - পুনরাবৃত্তি
  • v - ভার্জোজ (আপনাকে কী অনুলিপি করা হচ্ছে তা দেখায়)

1
এসএসএইচ ব্লুহোস্টে প্রবেশ করতে গিয়ে আমার যা করতে হয়েছিল তা একই।
বরফ

4
এটি সাবডিয়ারগুলি সংরক্ষণ করে না।
b005t3r

3
@ b005t3r যে নকশার ভিত্তিতে রয়েছে তা অনুমিত হয় না। ওপি-র প্রশ্নের পুরো উদ্দেশ্য ছিল এটি। তিনি সাবডাইরেক্টরির সমস্ত ফাইল সাবডিয়ার ছাড়াই একটি ডিরেক্টরিতে অনুলিপি চেয়েছিলেন
মাদীবাদ

2
সাব-ডিরেক্টরিগুলি সংরক্ষণের জন্য এটির সংশোধন করার কোনও উপায় আছে কি?
ম্যাথু ডিন

8

আমারও একই সমস্যা ছিল। আমি এটি ব্যবহার করে সমাধান করেছি:

find dir_name '*.mp3' -exec cp -vuni '{}' "../dest_dir" ";"

'{}'এবং ";"প্রতিটি ফাইলের উপর কপি সঞ্চালন করে।


3

আমাকে নিজেও এটি করতে হয়েছিল। আমি সিপির জন্য - প্যারেন্টস যুক্তির মাধ্যমে এটি করেছি:

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;

1
find [SOURCEPATH] -type f -name '[PATTERN]' | 
    while read P; do cp --parents "$P" [DEST]; done

আপনি - প্যারেন্টগুলি সরিয়ে ফেলতে পারেন তবে একাধিক ফাইল একই নাম ধারণ করলে সংঘর্ষের ঝুঁকি রয়েছে।

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