পুনরুক্তার সাথে .svn / ডিরেক্টরি উপেক্ষা করে কিছু বাদ দিয়ে নির্দিষ্ট ফাইলগুলি আরএসএনসি করুন


19

আমি rsyncকিছু ফাইল শেয়ার থেকে অন্যটিতে অনুলিপি করতে ব্যবহার করছি ।

পুনরাবৃত্তি, আমার প্রয়োজন:

  • গন্তব্যস্থলে ফাইলগুলি মুছুন যা উত্স থেকে সরানো হয়েছিল
  • কেবল সিঙ্ক .phpএবং .jsফাইল
  • অন্যান্য প্রতিটি ফাইলের প্রকার বাদ দিন
  • .svn/গন্তব্যে ডিরেক্টরি মুছবেন না

আমি যদি এটি ব্যবহার করি:

rsync -zavC --delete --include='*.php' --include='*.js' --exclude="*" \
    /origin /destination

তারপরে rsyncপুনরাবৃত্ত হয় না কারণ exclude="*"সমস্ত ফাইলগুলি বাদ দিয়ে ফোল্ডারগুলিও বাদ দেয়।

যদি আমি যোগ --include="*/"তারপর .svn/ডিরেক্টরির মোছা হয়েছে (এটা এছাড়াও অন্তর্ভুক্ত করা পরার)।

আমি কীভাবে এই মন বিস্ফোরক দ্বিধা সমাধান করতে পারি?

uname -a:

লিনাক্স টাক্স 3.9.2-1-ARCH # 1 এসএমপি প্রিম্পট শনি 11 ই মে 20:30:08 সিইএসটি 2013 x86_64 জিএনইউ / লিনাক্স

rsync সংস্করণ:

rsync 3.0.9-6

উত্তর:


13

প্রথম প্রচেষ্টা (কাজ হয়নি)

আপনাকে ফাইলগুলি ছাড়াও ডিরেক্টরিগুলি অন্তর্ভুক্ত করতে হবে:

rsync -zavC --delete --include '*/' --include='*.php' --include='*.js' \
     --exclude="*" /media/datacod/Test/ /home/lucas/Desktop/rsync/

দ্বিতীয় প্রচেষ্টা

rsync -avzC --filter='-rs_*/.svn*' --include="*/" --include='*.js' \
     --include='*.php' --exclude="*" --delete dir1/ dir2/

পরীক্ষার তথ্য

এটি পরীক্ষা করার জন্য কিছু নমুনা ডেটা তৈরি করতে আমি এই স্ক্রিপ্টটি লিখেছিলাম। এখানে সেই লিপিটি রয়েছে setup_svn_sample.bash:

#!/bin/bash

# setup .svn dirs
mkdir -p dir{1,2}/dir{1,2,3,4}/.svn

# fake data under .svn
mkdir -p dir1/dir{1,2,3,4}/.svn/origdir
mkdir -p dir2/dir{1,2,3,4}/.svn/keepdir

# files to not sync
touch dir1/dir{1,2,3,4}/file{1,2}

# files to sync
touch dir1/dir{1,2,3,4}/file1.js
touch dir1/dir{1,2,3,4}/file1.php

এটি চালানো নিম্নলিখিত ডিরেক্টরিগুলি উত্পাদন করে:

উত্স dir

$ tree -a dir1
dir1
|-- dir1
|   |-- file1
|   |-- file1.js
|   |-- file1.php
|   |-- file2
|   `-- .svn
|       `-- origdir
|-- dir2
|   |-- file1
|   |-- file1.js
|   |-- file1.php
|   |-- file2
|   `-- .svn
|       `-- origdir
|-- dir3
|   |-- file1
|   |-- file1.js
|   |-- file1.php
|   |-- file2
|   `-- .svn
|       `-- origdir
`-- dir4
    |-- file1
    |-- file1.js
    |-- file1.php
    |-- file2
    `-- .svn
        `-- origdir

গন্তব্য dir

$ tree -a dir2
dir2
|-- dir1
|   `-- .svn
|       `-- keepdir
|-- dir2
|   `-- .svn
|       `-- keepdir
|-- dir3
|   `-- .svn
|       `-- keepdir
`-- dir4
    `-- .svn
        `-- keepdir

উপরের rsyncকমান্ডটি চালাচ্ছি:

rsync -avzC --filter='-rs_*/.svn*' --include="*/" --include='*.js' \
     --include='*.php' --exclude="*" --delete dir1/ dir2/
sending incremental file list
dir1/file1.js
dir1/file1.php
dir2/file1.js
dir2/file1.php
dir3/file1.js
dir3/file1.php
dir4/file1.js
dir4/file1.php

sent 480 bytes  received 168 bytes  1296.00 bytes/sec
total size is 0  speedup is 0.00

Dir2 আফটারার্ডগুলির ফলাফল:

$ tree -a dir2
dir2
|-- dir1
|   |-- file1.js
|   |-- file1.php
|   `-- .svn
|       `-- keepdir
|-- dir2
|   |-- file1.js
|   |-- file1.php
|   `-- .svn
|       `-- keepdir
|-- dir3
|   |-- file1.js
|   |-- file1.php
|   `-- .svn
|       `-- keepdir
`-- dir4
    |-- file1.js
    |-- file1.php
    `-- .svn
        `-- keepdir

কেন এটি কাজ করে?

এই স্ক্রিপ্টের মূল অংশটি হল ফিল্টারগুলির সক্ষমতাটি ব্যবহার করা rsync। ফিল্টার আপনাকে কমান্ডের বিভিন্ন পয়েন্টে মিলে যাওয়া সেট থেকে ফাইলগুলি সরাতে দেয়। সুতরাং আমাদের ক্ষেত্রে আমরা কোনও ফাইল ফিল্টার করছি যা প্যাটার্নের সাথে মেলে */.svn*। সংশোধকরা -rs_ফিল্টারটিকে বলে যে আমরা উত্সের পাশাপাশি লক্ষ্য দিক উভয়কেই ফিল্টার করতে চাই।

আরএসআইএনসি'র ম্যান পেজের ফিল্টার নোটস অংশ থেকে উদ্ধৃত অংশ

  • কোনও পাঠানোর পক্ষের নিয়ম প্রযোজ্য তা নির্দেশ করতে একটি এস ব্যবহৃত হয়। যখন কোনও নিয়ম প্রেরণকারীকে প্রভাবিত করে, তখন ফাইল স্থানান্তরিত হতে বাধা দেয়। ডিফল্টটি --delete-excludedনির্দিষ্ট না হওয়া পর্যন্ত উভয় পক্ষকে প্রভাবিত করার নিয়মের জন্য , যদি ক্ষেত্রে ডিফল্ট নিয়মগুলি কেবল প্রেরক-হয়ে থাকে। হাইড (এইচ) এবং শো (এস) বিধিগুলিও দেখুন, যা প্রেরণ-পার্শ্বকে অন্তর্ভুক্ত / বাদ দেওয়া নির্দিষ্ট করার বিকল্প উপায়।

  • নিয়মটি প্রাপ্তির পক্ষে প্রযোজ্য তা নির্দেশ করতে একটি r ব্যবহার করা হয়। যখন কোনও নিয়ম গ্রহণের দিকটি প্রভাবিত করে, তখন ফাইলগুলি মোছা থেকে বাধা দেয়। আরও তথ্যের জন্য s সংশোধক দেখুন। সুরক্ষা (পি) এবং ঝুঁকি (আর) বিধিগুলিও দেখুন, যেগুলি রিসিভার-সাইডকে নির্দিষ্ট করে দেওয়ার / বাদ দেওয়া বাদ দেওয়ার বিকল্প উপায়।

আরও তথ্যের জন্য man rsync দেখুন ।

এটি নির্ধারণের জন্য টিপস (ব্যবহারের ইঙ্গিত --dry-run)

এটি কীভাবে করবেন তা বর্ণনা করার সময় আমি ভেবেছিলাম আমি --dry-runস্যুইচটিতে উল্লেখ করব rsync। এটি ' rsyncবাস্তবে না হয়ে কী ঘটবে তা দেখার জন্য অত্যন্ত কার্যকর ।

উদাহরণ স্বরূপ

নিম্নলিখিত কমান্ডটি ব্যবহার করে একটি পরীক্ষা চালানো হবে এবং আমাদের পিছনে সিদ্ধান্তের যুক্তি প্রদর্শন করবে rsync:

rsync --dry-run -avvzC --filter='-rs_*/.svn*' --include="*/" \
     --include='*.js' --include='*.php' --exclude="*" --delete dir1/ dir2/
sending incremental file list
[sender] showing directory dir3 because of pattern */
[sender] showing directory dir2 because of pattern */
[sender] showing directory dir4 because of pattern */
[sender] showing directory dir1 because of pattern */
[sender] hiding file dir1/file1 because of pattern *
[sender] showing file dir1/file1.js because of pattern *.js
[sender] hiding file dir1/file2 because of pattern *
[sender] showing file dir1/file1.php because of pattern *.php
[sender] hiding directory dir1/.svn because of pattern */.svn*
[sender] hiding file dir2/file1 because of pattern *
[sender] showing file dir2/file1.js because of pattern *.js
[sender] hiding file dir2/file2 because of pattern *
[sender] showing file dir2/file1.php because of pattern *.php
[sender] hiding directory dir2/.svn because of pattern */.svn*
[sender] hiding file dir3/file1 because of pattern *
[sender] showing file dir3/file1.js because of pattern *.js
[sender] hiding file dir3/file2 because of pattern *
[sender] showing file dir3/file1.php because of pattern *.php
[sender] hiding directory dir3/.svn because of pattern */.svn*
[sender] hiding file dir4/file1 because of pattern *
[sender] showing file dir4/file1.js because of pattern *.js
[sender] hiding file dir4/file2 because of pattern *
[sender] showing file dir4/file1.php because of pattern *.php
[sender] hiding directory dir4/.svn because of pattern */.svn*
delta-transmission disabled for local transfer or --whole-file
[generator] risking directory dir3 because of pattern */
[generator] risking directory dir2 because of pattern */
[generator] risking directory dir4 because of pattern */
[generator] risking directory dir1 because of pattern */
[generator] protecting directory dir1/.svn because of pattern */.svn*
dir1/file1.js
dir1/file1.php
[generator] protecting directory dir2/.svn because of pattern */.svn*
dir2/file1.js
dir2/file1.php
[generator] protecting directory dir3/.svn because of pattern */.svn*
dir3/file1.js
dir3/file1.php
[generator] protecting directory dir4/.svn because of pattern */.svn*
dir4/file1.js
dir4/file1.php
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 231 bytes  received 55 bytes  572.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

উপরের আউটপুটে আপনি দেখতে পাবেন যে ./svnডিরেক্টরিগুলি আমাদের ফিল্টার বিধি দ্বারা সুরক্ষিত হচ্ছে। ডিবাগ করার জন্য মূল্যবান অন্তর্দৃষ্টি rsync

তথ্যসূত্র


ইতিমধ্যে এটি চেষ্টা করেছি, যেমন আমি উপরে বলেছি। যদি আমি এটি করি, তবে .SVN ডিরেক্টরিটিও অন্তর্ভুক্ত হয়ে যায় (সম্ভবত মুছে ফেলা হবে, কারণ এটি উত্সে নেই বা পরিবর্তিত)। .SVN ডিরেক্টরিটি ছোঁয়া ছেড়ে দেওয়া সমালোচনা। যাইহোক চেষ্টা করার জন্য ধন্যবাদ! :)
canolucas

-সি ".SVN /" উপেক্ষা করার কথা include="*/"রয়েছে , তবে এটি অন্তর্ভুক্ত করেছে
ক্যানোলোকেস

তুমি ঠিক. .svnউত্তরটি সম্পাদনা করা উচিত । যাইহোক, নামটির পরে সমস্যাটি রয়ে গেছে। -Cএবং include="*/"খুব ঘনিষ্ঠ বন্ধু বলে মনে হচ্ছে না :(
ক্যানোলোকেস

10

ঠিক আছে, বেশ কয়েকটি চেষ্টার পরে আমি এটি বাছাই করেছি:

rsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' \
    --include='*/' --exclude='*' --prune-empty-dirs \
    --filter "protect .svn/" /origin /destination

ধন্যবাদ


দুর্দান্ত উত্তর। আমার ফিল্টারটি .svn/ডায়ারদের --prune-empty-dirsখালি থাকার ক্ষেত্রে রক্ষা করে । আরেকটি পদ্ধতির, এটি খালি rsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' --include='*/' --exclude='*' /origin /destination
ডায়ারগুলিকে

আমার পদ্ধতির মূল হয় --exclude=.svn/আগে --include's
canolucas

ভাল উত্তর। আমি একটি বর্জন = '। এসএনএন /' পরামর্শ দিয়েছি তবে আমি ভেবেছিলাম আপনি এটি ব্যবহার করতে চান -C। ভাগ্যিশ তুমি বুঝতে পেরেছ!
slm

0

যদিও এটি আরএসসিএনসি ব্যবহার করছে না তা সন্ধান এবং সিপিও ব্যবহার করা অন্য বিকল্প। উদাহরণস্বরূপ আমার কাছে ফটো নামে একটি ডিরেক্টরি রয়েছে এবং এটি বছর এবং মাস।

Photos
├── 2002
   ├── 2002-03
      ├── 2002-03-30
      ├── 2002-03-31
      └── 2002-03-31-02
   ├── 2002-04
      ├── 2002-04-01
      ├── 2002-04-01-03
      ├── 2002-04-07
      ├── 2002-04-21
      ├── 2002-04-22
      ├── 2002-04-22-02
      └── 2002-04-27
   ├── 2002-05
      ├── 2002-05-02
      ├── 2002-05-03

তবে এখানে আমার কাছে জেপিজি, ডিএনজি, এক্সএমএল এবং অন্যান্য জিনিস রয়েছে এবং আমি কেবল জেপিজি চাই তাই আমি এটি করতে পারি

ফটো ডিরেক্টরিতে উপরের ডিরেক্টরিতে "সিডি" তারপরে:

find Photos -type f -name "*jpg" -print | cpio -pdmvu /fast

এবং বন্ধ এটি যায়

/fast/Photos/2002/2002-04/2002-04-22/bath problem.jpg
/fast/Photos/2002/2002-04/2002-04-22-02/full bath.jpg
/fast/Photos/2002/2002-07/2002-07-10/Broken Top.jpg
/fast/Photos/2002/2002-12/2002-12-28/101-0125_IM~~G.jpg
/fast/Photos/2002/2002-12/2002-12-28/small-101-0125_IM~~G.jpg
/fast/Photos/2003/2003-01/2003-01-19/k1.jpg
/fast/Photos/2003/2003-01/2003-01-19/k2.jpg
/fast/Photos/2003/2003-02/2003-02-23/quinn.jpg
/fast/Photos/2003/2003-05/2003-05-04/all.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0015_r1.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0006_2_r1.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0006_r1.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0007_2_r1.jpg

আপনি এই পদ্ধতিটি প্রচুর জিনিসের জন্য ব্যবহার করতে পারেন, বহু বছর আগে বৃহত্তর ডিস্কে স্থানান্তরিত করার সময় আমরা / ফাইল সিস্টেমটি অনুলিপি করব কারণ এটি ডিভাইস ফাইলগুলি অনুলিপি করবে।


যে প্রশ্নের উত্তর দেয় না।
র‌্যালফ্রেডল

এটি যদি সে ব্যবহার করে তবে তা করে: সন্ধান / উত্স -প্রকার-এফ (-নেম "। Php" -o -name " .js") -প্রিন্ট | সিপিও -পিডিএমভিউ / গন্তব্য কেবলমাত্র *। php এবং * .js ফাইলগুলি লক্ষ্য নির্দেশিকায় থাকবে।
lxtwin
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.