ফোল্ডারের কাঠামো রেখে নির্দিষ্ট ফাইল প্রকারের অনুলিপি করুন


108

আমার ফোল্ডারের কাঠামো রয়েছে * .csv ফাইলের গুচ্ছ সহ ফোল্ডারগুলিতে ছড়িয়ে। এখন আমি ফোল্ডারের কাঠামো রেখে সমস্ত * .csv ফাইল অন্য গন্তব্যে অনুলিপি করতে চাই।

এটি করে কাজ করে:

cp --parents *.csv /target
cp --parents */*.csv" /target
cp --parents */*/*.csv /target
cp --parents */*/*/*.csv /target
...

এবং এইভাবে, তবে আমি এটি একটি কমান্ড ব্যবহার করে করতে চাই।

উত্তর:


126

লোকেরা অনুসন্ধানগুলি ব্যবহার করে প্রতিরোধ করার কোনও কারণ আছে কি -exec? এটা খুব সহজ।

find . -name '*.csv' -exec cp --parents \{\} /target \;

আপনার সরঞ্জামগুলি জানুন। ;-)


62
সম্ভবত এটি \ {\} \ এর কারণে;
igo

12
'{}'ঠিক পাশাপাশি কাজ করে
অরেঞ্জডগ

3
যদিও এটির -execdirতুলনায় নিরাপদ -exec, কেবল একটির সাথে অন্যটির প্রতিস্থাপন করা ফোল্ডারের কাঠামোটি যেমন ইচ্ছা তেমন সংরক্ষণ করে না।
সাইমন শাইন

2
আমি যখন আপনার আদেশ দিয়ে তাদের অনুলিপি করার চেষ্টা করি তখন কেন আমি বার্তাটি 'ছাড়ার ডিরেক্টরি' পাই?
ভিকি দেব

4
ধনুর্বন্ধনী এখানে পালাতে হবে কেন আপনি ব্যাখ্যা করতে পারেন?
নুমেনন

46

আপনি rsyncএই জন্য ব্যবহার করতে পারে ।

$ rsync -a --prune-empty-dirs --include '*/' --include '*.csv' --exclude '*' source/ target/

আপনি যদি উত্স গাছ থেকে খালি ডিরেক্টরি রাখতে চান তবে --prune-empty-dirsবিকল্পটি এড়িয়ে যান :

$ rsync -a --include '*/' --include '*.csv' --exclude '*' source/ target/

আপনি যদি সিমলিঙ্ক, পরিবর্তনের তারিখ, ফাইল অনুমতি, মালিক ইত্যাদি সংরক্ষণিত না চান তবে দয়া করে এর -aঅন্য সংমিশ্রণটি দিয়ে প্রতিস্থাপন করুন -rlptgoD। ;-)


1
-mএর জন্য একটি শর্টকাট --prune-emty-dirs
জেরেমিয়া

এছাড়াও, -Rউত্সের পিতামহুল ডিরেক্টরি কাঠামোটি অনুলিপি করতে বিকল্প যুক্ত করা যেতে পারে। (সিএফ। আমার উত্তর এখানে।)
জেরেমিয়া

-আর আমার জন্য কাজ করে! ধন্যবাদ
gigi2

32

আপনি ব্যবহার করতে পারেন খোঁজ এবং cpio মোড মাধ্যমে পাস

find . -name '*.csv' | cpio -pdm  /target

এটি বর্তমান ডিরেক্টরিতে এবং নীচে সমস্ত .csv ফাইলগুলি সন্ধান করবে এবং সেগুলিকে মূল লক্ষ্যযুক্ত ডিরেক্টরি কাঠামো বজায় রাখা / টার্গেটে অনুলিপি করবে .

আপনি যদি ব্যবহার

find /path/to/files -name '*.csv' | cpio -pdm /target

এটি ভিতরে /path/to/filesএবং নীচের সমস্ত ফাইল খুঁজে পেতে /target/path/to/filesএবং সেগুলি নীচে এবং অনুলিপি করবে ।


3
আমি এই উত্তর পর্যন্ত উপরে সমস্ত উত্তর চেষ্টা করেছিলাম, এবং এটিই প্রথম যে প্রথম প্রচেষ্টাটিতে কাজ করেছিল
অস্কাররিজ

21

cpকমান্ড একাধিক উৎস আর্গুমেন্ট অনুমতি দেয়:

cp **/*.csv --parents ../target

ক্যাভেট: আমি এখানে একটি পুনরাবৃত্ত গ্লোব ব্যবহার করছি; এটি globstarবাশ 4+ এ বিকল্প kshএবং এটিকে ডিফল্টরূপে সমর্থন করে zsh। রিকার্সিভ গ্লোবগুলি লুকানো ফাইল এবং ফোল্ডারগুলির সাথে মেলে না এবং কিছু বাস্তবায়ন সিমলিংকগুলি অনুসরণ করে যখন অন্যরা তা করে না

যদি আপনার শেল পুনরাবৃত্ত গ্লোবগুলিকে সমর্থন করে না বা আপনি যদি সেগুলি ব্যবহার না করতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন:

  • *.csv */*.csv */*/*.csv */*/*/*.csv - এটি অবশ্যই খুব বাড়াবাড়ি এবং আপনার ডিরেক্টরি কাঠামোটি কত গভীর তা জানা দরকার।
  • $(find . -name '*.csv')- এই করবে লুকানো ফাইল এবং ফোল্ডার মেলে। findএছাড়াও সিমলিঙ্কগুলি অনুসরণ করা হচ্ছে কিনা তা নির্দিষ্ট করে সমর্থন করে যা কার্যকর হতে পারে।

এটি হ'ল আমি যা চেষ্টা করেছি (পুনরাবৃত্ত গ্লোব) এবং এটি কিছু খুঁজে পেয়েছিল তবে সব পাওয়া যায়নি? বেশ উদ্ভট. এনপিএম কপিফাইলে স্ক্রিপ্টটি ব্যবহার করার সময় আমি ঠিক একই ফলাফল পেয়েছি তবে আমি যদি ফাইন্ড কমান্ডটি ব্যবহার করি তবে এটি সমস্ত কিছু খুঁজে পেয়েছে ...
রন্ধ্যা

@ রন্ধ্যা আমার আরও কিছু বিবরণ দরকার যা ঠিক কোন ফাইলগুলি আপনাকে সহায়তা করার জন্য খুঁজে পাওয়া যায় নি। আপনি আলোচনা হতে পারে এখানে এবং অব্যাহত এখানে রিকার্সিভ উল্লিখিত glob দরকারী সুনির্দিষ্ট আচরণ সম্পর্কে।
কাইল স্ট্র্যান্ড

1
দেখা যাচ্ছে যে কোনও কারণে रिकার্সিভ গ্লোব সক্ষম ছিল না ... আমি এর আগে কখনও চালাতে পারি নি তবে shopt -s globstarআমার কমান্ডের সাথে সাথেই এটি কার্যকর করার সাথে সাথে আমি এটিকে সংশোধন করেছি এবং সবকিছু ঠিক আছে। ফলোআপের জন্য ধন্যবাদ!
রন্ধ্যা 15

--parentsআমি কি খুঁজছিলাম ছিল। ধন্যবাদ
জোশ

17

এই একজন আমার পক্ষে কাজ করেছেন:

find -name "*.csv" | xargs cp --parents -t /target


সর্বাধিক সহজ বাক্য গঠন সহ সেরা উত্তর। ঠিক সূক্ষ্মভাবে কাজ করে এবং এটি মনে রাখা সহজ। অনেক ক্ষেত্রেই find [things] | xargs [do stuff]খুব পাওয়ারফুল হয়।
প্রতিদিনের নভোচারী

একমত। অন্যান্য উত্তরগুলির তুলনায় খুব সোজা
টিম বি

1
আপনার যদি ফাইলনামে ফাঁকা স্থান থাকে
মিশেল পিকলিনি

ফাইলের নামের মধ্যে @MichelePiccolini শূন্যস্থানের সঙ্গে পরিচালনা করা যায় find -print0এবং xargs -0
pasztorpisti

8

ধরে নেওয়া যাক আপনার কাছ থেকে এই কাঠামো প্রতিলিপি করতে চান ./sourceকরতে ./destination:

cd source
find . -name "*.csv" | xargs tar cvf - | (cd ../destination ; tar xfp -)

আমি এক লাইন হিসাবে এটি cd sourceশেল বিল্টিন হিসাবে গণনা করতে প্রস্তুত ।


2
আমি মনে করি না যে সে আসলেই একটি আদেশের অর্থ - কেবল তার উদাহরণের মতো ফাগ করতে হবে না;)

tar-Cডিরেক্টরিটি প্রথমে পরিবর্তন করতে না পারার বিকল্প রয়েছে ।
বার্ট

8

থেকে rsyncএর র manpage:

-আর, - সম্পর্কিত

আপেক্ষিক পথ ব্যবহার করুন। এর অর্থ হ'ল কমান্ড লাইনে নির্দিষ্ট করা পুরো পথের নামগুলি ফাইলের নামের শেষ অংশগুলির পরিবর্তে সার্ভারে প্রেরণ করা হয়। আপনি একই সাথে বেশ কয়েকটি ভিন্ন ডিরেক্টরি প্রেরণ করতে চাইলে এটি বিশেষভাবে কার্যকর। উদাহরণস্বরূপ, আপনি যদি এই আদেশটি ব্যবহার করেন:

rsync -av /foo/bar/baz.c remote:/tmp/

... এটি রিমোট মেশিনে / tmp / ইন baz.c নামে একটি ফাইল তৈরি করবে। পরিবর্তে যদি আপনি ব্যবহার

rsync -avR /foo/bar/baz.c remote:/tmp/

তারপরে রিমোট মেশিনে /tmp/foo/bar/baz.c নামের একটি ফাইল তৈরি করা হবে, এটির পুরো পথটি সংরক্ষণ করে। এই অতিরিক্ত পাথ উপাদানগুলিকে "অন্তর্ভুক্ত ডিরেক্টরিগুলি" বলা হয় (যেমন উপরের উদাহরণে "foo" এবং "foo / বার" ডিরেক্টরিগুলি)।

সুতরাং, এটি কাজ করবে:

rsync -armR --include="*/" --include="*.csv" --exclude="*" /full/path/to/source/file(s) destination/
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.