কেবলমাত্র কিছু ফাইল অন্তর্ভুক্ত করতে রিজেক্স ব্যবহার করে rsync


11

আমি তাদের ফাইলের নাম প্যাটার্ন, কেস সেনসিটিভিটিভের ভিত্তিতে কিছু ফাইল পুনরাবৃত্তভাবে একটি ফাইল অনুলিপি করতে আরএসসিএন চালানোর চেষ্টা করছি । আমি আরএসসিএনসি চালানোর জন্য এটি করেছি:

$ rsync -avvz --include ='*/' --include='.*[Nn][Aa][Mm][E].*' --exclude='*' ./a/ ./b/

কিছুই অনুলিপি করা হয় না, ডিবাগ আউটপুট দেখায়:

[sender] hiding file 1Name.txt because of pattern *
[sender] hiding file 1.txt because of pattern *
[sender] hiding file 2.txt because of pattern *
[sender] hiding file Name1.txt because of pattern *
[sender] hiding directory test1 because of pattern *
[sender] hiding file NaMe.txt because of pattern *

আমি ব্যবহার করার চেষ্টা করেছি: --include='*[Nn][Aa][Mm][E]*'এবং অন্যান্য সংমিশ্রণগুলি কিন্তু এটি এখনও যায় না।

কিছু ফাইল অন্তর্ভুক্ত করতে কীভাবে রেজেক্স ব্যবহার করবেন সে সম্পর্কে কোনও ধারণা?


4
আপনি কেন ব্যবহার করছেন --exclude='*'?

2
সুতরাং এটি অন্তর্ভুক্ত অংশ নয় এমন সমস্ত কিছু বাদ দেয়।

'প্যাটার্নের কারণে ফাইল 1Name.txt আড়াল করা ' এটি সূচিত করে: - "- যে বিয়োগ বিধিটি কমান্ডে থাকা দরকার?" অথবা আপনি যদি কিছু ফাইল বাদ দিতে চান তবে কেন " "।
অক্ষয় পাতিল

উত্তর:


5

আরএসআইএনসি রিজেক্স কথা বলে না। আপনি এটি তালিকাভুক্ত করতে পারেন এবং গ্রেপ করতে পারেন, যদিও এটি সামান্য আরকেন পায়। লক্ষ্যযুক্ত ফাইলগুলি সন্ধান করতে:

find a/ |
grep -i 'name'

তবে এগুলি সবাই "এ /" দিয়ে উপস্থাপিত হয়েছে - যা বোঝা যায়, তবে আমরা যা শেষ করতে চাই তা হ'ল আরএসসিএনকে গ্রহণযোগ্য নিদর্শনগুলির একটি তালিকা রয়েছে এবং "এ /" উপসর্গটি আরএসআইএনসি I এর জন্য কাজ করে না এটি কাটা দিয়ে মুছে ফেলব:

find . |
grep -i 'name' |
cut -d / -f 2-

এখনও একটি সমস্যা আছে - আমরা এখনও উপ-ডিরেক্টরিগুলিতে ফাইলগুলি মিস করব, কারণ আরএসআইএনসি বাদ দেওয়া তালিকার ডিরেক্টরিগুলি অনুসন্ধান করে না। আমি প্যাটার্নগুলি অন্তর্ভুক্তের তালিকায় কোনও মিলে যাওয়া ফাইলের উপ-ডিরেক্টরিগুলি যুক্ত করতে বিশ্রী ব্যবহার করতে যাচ্ছি:

find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}'

যা বাকি আছে তা হল তালিকাটি আরএসইএনসি-তে প্রেরণ করা - আমরা স্ট্যান্ডার্ড ইনপুটটিতে আরএসএনসি-তে নিদর্শনগুলির একটি তালিকা সরবরাহ করতে - যুক্ত - থেকে = - যুক্তিটি ব্যবহার করতে পারি। সুতরাং, পুরোপুরি:

find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/

নোট করুন যে উত্স ডিরেক্টরি 'এ' দুটি পৃথক পাথের মাধ্যমে উল্লেখ করা হয় - "এ /" এবং "./a/"। এটি সূক্ষ্ম তবে গুরুত্বপূর্ণ। জিনিসগুলিকে আরও সুসংগত করতে আমি একটি চূড়ান্ত পরিবর্তন করতে যাচ্ছি, এবং সর্বদা উত্স ডিরেক্টরিটিকে "./a/" হিসাবে উল্লেখ করি। যাইহোক, এর অর্থ কাট কমান্ডটি পরিবর্তন করতে হবে কারণ ফলাফলগুলির সামনে ফলাফলের সামনে একটি অতিরিক্ত "./" থাকবে:

find ./a/ |
grep -i 'name' |
cut -d / -f 3- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/

এটি চালানোর চেষ্টা করা হয়েছে, কাট কমান্ডটি নিয়ে ইস্যুগুলিতে ছড়িয়ে পড়ে। মনে -tহচ্ছে এটি একটি বৈধ সুইচ।

সম্পাদনা: আমি বোঝাতে

দুঃখিত, করা উচিত। আমি সেড ব্যবহার শুরু করেছিলাম এবং তারপরে কাটতে পরিবর্তিত হয়েছি কারণ আমি ভেবেছিলাম এটি আরও পরিষ্কার হয়েছে তবে আমার আদেশগুলি সম্পাদনা করতে ভুলে গেছেন: এস

ফলোআপ করুন: ফাইলের সাথে + এক্সটেনশনের মিশ্রণ হিসাবে আমি যুক্তিগুলি ($ 1 = পাথ_ টু_সন্ধান, উদাহরণস্বরূপ eg 2) নেওয়ার জন্য স্ক্রিপ্ট সম্পাদনা করার চেষ্টা করেছি। এই অংশগুলি দুর্দান্ত কাজ করে, আমি প্রত্যাশিত তালিকা পেয়েছি, তবে আরএসসিএনপি অনুলিপি করতে ব্যর্থ। এটি কেবলমাত্র সিঙ্গল নেম চরিত্রের ডিরেক্টরিতে কাজ করছে যেমন উদাহরণ হিসাবে বলা হয়েছে (ক) আমার অনুমান যে কাটা কমান্ডটি প্যারেন্ট / বা উত্স দিরের উপর ভিত্তি করে অক্ষরগুলি কাটতে পরিবর্তন করতে হবে? কিন্ডা কীভাবে এটি করবেন তা হারিয়েছিলেন:
ব্যবহারকারী 1957413

হ্যাঁ, আপনি ঠিক বলেছেন। এটি কোনও দৈর্ঘ্যের ডিরেক্টরি নামের উপর কাজ করা উচিত, তবে আপনি বর্তমান ডিরেক্টরিটির বাইরের কোনও ডিরেক্টরি উল্লেখ করার সাথে সাথে ব্যর্থ হয়ে যাবে (কারণ উপসর্গের অংশে আলাদা আলাদা সংখ্যক স্ল্যাশ থাকবে)। এটি ঠিক করার জন্য, sed "s#^$1/*##" কাটের পরিবর্তে সম্ভবত সবচেয়ে সহজে ব্যবহার করা সহজ, যেমন: এমন একটি পাথ যেগুলি একটি # রয়েছে এমন পথে ভেঙে দেবে u এটি ঠিক করার জন্য আমাদের আগত ডিরেক্টরিটির নামটি উদ্ধৃত করতে হবে: prefix=$(echo "$1" | sed 's#/#\\/#g')এবং তারপরে sed "s/^$prefix\\/*//" বাশ উদ্ধৃতি দেওয়ার মানগুলি একটি দুঃস্বপ্নের কিছুটা;)
স্কুওয়েক

7

আমি rsync এর ফিল্টার বিকল্পটি ব্যবহার করার পরামর্শ দেব would আপনার উদাহরণের জন্য কেবল টাইপ করুন:

rsync -vam -f'+ *[Nn][Aa][Mm][E]*' -f'+ */' -f'- *' a b

প্রথম ফিল্টার নিয়মটি rsync কে কী ধরণের অন্তর্ভুক্ত করতে হবে তা বলে। দ্বিতীয় নিয়মটি প্রয়োজন হয় আরএসসিএনকে তার ট্র্যাভারসাল সমস্ত ডিরেক্টরিতে পরিদর্শন করতে বলুন। খালি ডায়ারগুলি অন্তর্ভুক্তি থেকে রোধ করতে তাদের -mবিকল্প দ্বারা স্পষ্টতই বাদ দেওয়া হয়েছে । সর্বশেষ ফিল্টার নিয়মটি আরএসসিএনকে এখনও অবধি মেলে না এমন সমস্ত অবশিষ্ট নিদর্শনগুলি নিষ্পত্তি করতে বলে।


মিষ্টি। এটি পাশাপাশি কাজ করেছে। আমি ফোল্ডারটি খ-এর ভিতরে পেয়ে যাচ্ছিলাম, এটি উত্স এবং গন্তব্য হিসাবে / বি / ব্যবহার করে ঠিক হয়ে গেছে। ধন্যবাদ!
ব্যবহারকারী1957413

নির্দিষ্ট নামের সাথে সমস্ত ডিরেক্টরিগুলির বিষয়বস্তু অন্তর্ভুক্ত করতে -f '+ * [এনএন] [এএ] [এমএম] [ই] **' (শেষে দুটি তারকা) ব্যবহার করুন।
ফোবিজ

2

আপনি যদি জেডএসএইচ ব্যবহার করেন তবে কেস সংবেদনশীলতা বন্ধ করতে আপনি (# আই) পতাকা ব্যবহার করতে পারেন। উদাহরণ:

$ touch NAME
$ ls (#i)*name*
NAME

জেডএসএইচ ব্যতিক্রমগুলি সমর্থন করে, যা নিয়মিত পাথের মতোই নির্দিষ্ট করা থাকে তবে তাদের প্রাথমিক ~ থাকে ~

$ touch aa ab ac
$ ls *~*c
aa ab

আপনি ব্যতিক্রম চেইন করতে পারেন:

$ ls *~*c~*b
aa

আপনি কী ধরনের ফাইল (ডিরেক্টরি, ফাইল ইত্যাদি) ফিরিয়ে দিতে চান তা শেষ পর্যন্ত উল্লেখ করতে পারেন। এটি ডিরেক্টরিতে (/) এবং ফাইলের জন্য (।) দিয়ে সম্পন্ন হয়।

$ touch file
$ mkdir dir
$ ls *(.)
file

এই সমস্ত কিছুর ভিত্তিতে, আমি সেই আদেশটি এইভাবে করব:

rsync -avvz *(/) (#i)*name* ./a/ ./b/

(আমি এই নির্বাচকদের সাথে বাদ পড়ার প্রয়োজন দেখছি না)


1

@ উপরের স্কিউইকের উত্তরটি দুর্দান্ত, যদিও আমি সন্দেহ করি যে তিনি তার awkস্ক্রিপ্টে পিতামাত্ত্বিক ডিরেক্টরি তৈরির জন্য একটি বাগ আছে , কারণ এটি আমাকে দেয়:

$ echo a/b/c/d | awk -F/ '{print; while(/\//) {sub("/[^/]*", ""); print}}'
a/b/c/d
a/c/d
a/d
a

gensubপরিবর্তে ব্যবহার করে আমি এটি ঠিক করতে সক্ষম হয়েছি :

$ echo a/b/c/d | awk -F/ '{print; while(/\//) { $0=gensub("(.*)/[^/]*", "\\1", "g"); print}}'
a/b/c/d
a/b/c
a/b
a

সুতরাং, তার সম্পূর্ণ সমাধানটি, awkকিছুটা পরিবর্তিত হয়ে গেলে তা হ'ল:

find ./a/ |
grep -i 'name' |
cut -d / -f 3- |
awk -F/ '{print; while(/\//) { $0=gensub("(.*)/[^/]*", "\\1", "g"); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/

ধন্যবাদ। আমার উত্তর সম্পাদনা করে লাইনের শেষে ( sub("/[^/]*$")) রেঞ্জেক্স অ্যাঙ্করিংয়ের সমতুল্য ঠিক সহ fix
sqweek

0

একটি সি # স্ক্রিপ্ট দিয়ে চেষ্টা করার পরে যে ভাষাটি আমার সবচেয়ে বেশি অভিজ্ঞতা আছে is আমি যে ফাইলগুলিকে অন্তর্ভুক্ত করতে চাইছি তার তালিকা তৈরি করতে সক্ষম হয়েছি, কিন্তু আরএসসিএনসি এখনও আমাকে বলছে যে কোনও দাম বাড়িয়ে নিন। এটি ফোল্ডারগুলি তৈরি করে তবে এটি ফাইলগুলিকে উপেক্ষা করে। আমি যা পেয়েছিলাম তা এখানেই ..

প্রথমে ডিরেক্টরিটির বিষয়বস্তু:

~/mono$ ls -l
total 24
drwxr-xr-x 5 me me 4096 Jan 15 00:36 a
drwxr-xr-x 2 me me 4096 Jan 15 00:36 b
drwxr-xr-x 3 me me 4096 Jan 14 00:31 bin
-rw-r--r-- 1 me me 3566 Jan 15 00:31 test.cs
-rwxr-xr-x 1 me me 4096 Jan 15 00:31 test.exe
-rwxr--r-- 1 me me  114 Jan 14 22:40 test.sh

তারপরে সি # স্ক্রিপ্টের আউটপুট:

~/mono$ mono test.exe

/a/myfile/myfileseries.pdf
/a/myfile2/testfile.pdf

এবং ডিবাগ আউটপুট:

~/mono$ mono test.exe | rsync -avvvz --include='*/' --include-from=- --exclude='*' ./a/ ./b/
[client] add_rule(+ */)
[client] parse_filter_file(-,20,3)
[client] add_rule(+ /a/myfile/myfileseries.pdf)
[client] add_rule(+ /a/myfile2/testfile.pdf)
[client] add_rule(- *)
sending incremental file list
[sender] make_file(.,*,0)
[sender] hiding file 1Name.txt because of pattern *
[sender] showing directory myfile2 because of pattern */
[sender] make_file(myfile2,*,2)
[sender] hiding file 1.txt because of pattern *
[sender] hiding file 2.txt because of pattern *
[sender] hiding file Name1.txt because of pattern *
[sender] showing directory test1 because of pattern */
[sender] make_file(test1,*,2)
[sender] hiding file NaMe.txt because of pattern *
[sender] showing directory myfile because of pattern */
[sender] make_file(myfile,*,2)
send_file_list done
send_files starting
[sender] hiding file myfile/myfileseries.pdf because of pattern *
[sender] hiding file myfile2/testfile.pdf because of pattern *
[sender] hiding file test1/test.txt because of pattern *

0

[সম্পাদনা] এটি কেবল স্থানীয়ভাবে কাজ করে। দূরবর্তী পাথের জন্য, প্রথমে ডিরেক্টরি কাঠামো তৈরি করতে হবে।

গৃহীত উত্তরের চেয়ে আরও সহজ; - ফাইল ফাইল ব্যবহার করুন, যার মধ্যে প্যারেন্ট ডিরেক্টরিগুলি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত থাকে এবং% P দিয়ে ফাইলের পাথ প্রিন্ট করে

find /tmp/source -wholename '*[Nn][Aa][Mm][E]*' -printf '%P\n' | rsync -vzrm --exclude='*/' --files-from=- /tmp/source/ /tmp/target/

সুতরাং আপনি শুধুমাত্র ব্যবহার করতে হবে findএবং rsync

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