কেবলমাত্র একটি নির্দিষ্ট ফাইলের তালিকাটি আরএসএনসি কিভাবে করবেন?


95

আমি বিভিন্ন সাব-ডিরেক্টরিতে প্রায় 50 বা তার বেশি ফাইল করেছি যা আমি একটি রিমোট সার্ভারে চাপতে চাই। আমি ভেবেছিলাম আরএসসিএনই - - অন্তর্ভুক্ত-থেকে বিকল্পটি ব্যবহার করে আমার জন্য এটি করতে সক্ষম হবে। --Excolve = "*" বিকল্প ব্যতীত ডিরেক্টরিতে থাকা সমস্ত ফাইল সিঙ্ক করা হচ্ছে, বিকল্পের সাথে কোনও ফাইল নেই।

rsync -avP -e ssh --include-from=deploy/rsync_include.txt --exclude=* ./ root@0.0.0.0:/var/www/ --dry-run

আমি এটি প্রাথমিকভাবে শুষ্ক হিসাবে চালাচ্ছি এবং 0.0.0.0 স্পষ্টতই দূরবর্তী সার্ভারের আইপি দ্বারা প্রতিস্থাপিত হয়েছে। Rsync_incolve.txt এর সামগ্রীগুলি আমি আপলোড করতে চাইলে ফাইলগুলির আপেক্ষিক পাথের একটি নতুন লাইন দ্বারা পৃথক করা তালিকা।

সোমবার সকালে আমার থেকে বাঁচার মতো আরও ভাল উপায় কি আছে?

উত্তর:


4

সম্পাদনা করুন: নীচে জোসিপ রডিনের উত্তর আরও ভাল। দয়া করে এটি ব্যবহার করুন!

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

# rsync -avP -e ssh `cat deploy/rsync_include.txt` root@0.0.0.0:/var/www/

তবে এটি ধরেই নেওয়া হচ্ছে যে আপনার তালিকাটি এত দীর্ঘ নয় যে কমান্ড লাইনের দৈর্ঘ্য একটি সমস্যা হয়ে দাঁড়াবে এবং rsync_include.txtফাইলটিতে কেবল আসল পথ রয়েছে (যেমন কোনও মন্তব্য নেই, এবং কোনও রেজেক্সপস নেই)।


9
দুর্ভাগ্যক্রমে, এটি কোনও বড় তালিকার সাথে বা নামের ফাঁকা জায়গাগুলির ফাইলগুলির সাথে কাজ করে না।
ওয়েস মোডগুলি

4
[যুক্তি তালিকা খুব দীর্ঘ]
ডানকা ডেভিড

ডিফল্টরূপে, xargs কমান্ড লাইনের শেষে স্টিডিন থেকে যুক্তি যুক্ত করে। গন্তব্য হওয়ার জন্য আরএসএনসি-র শেষ যুক্তির প্রয়োজন হওয়ায় এটি কাজ করে না। Xargs এর কিছু সংস্করণ পরিবর্তে কমান্ড লাইনের মাঝখানে যুক্তি সন্নিবেশ করতে পারে। এটি যতক্ষণ কাজ করবেন না যতক্ষণ না আপনি যখন ফাইলগুলির তালিকা দীর্ঘ হয় তখন এটি একাধিকবার rsync চালাতে পারে। যাই হোক, rsync --files-fromসম্ভবত একটি সহজ এবং অধিক নির্ভরযোগ্য সমাধান :)
লাচ্ছি

ওয়েস হার্ডকার: "জোসিপ রডিনের উত্তর" এর জন্য আপনার সম্পাদনা এবং রেফারেন্সটি কি আসলেই রডিন সম্পাদিত @atp উত্তরকে বোঝায় ?
সিউমাস

234

এখানে একটি পতাকা রয়েছে --files-fromযা আপনি যা চান ঠিক তেমন করে। থেকে man rsync:

--files-from=FILE

এই বিকল্পটি ব্যবহার করা আপনাকে স্থানান্তর করার জন্য ফাইলের সঠিক তালিকা নির্দিষ্ট করতে দেয় (নির্দিষ্ট ফাইল থেকে পড়া হিসাবে বা - স্ট্যান্ডার্ড ইনপুট জন্য)। কেবলমাত্র নির্দিষ্ট ফাইল এবং ডিরেক্টরিগুলি স্থানান্তরকে সহজতর করার জন্য এটি আরএসসিঙ্কের ডিফল্ট আচরণকেও সামঞ্জস্য করে:

  • --Relative (-R) বিকল্পটি অন্তর্ভুক্ত করা হয়েছে, যা ফাইলের প্রতিটি আইটেমের জন্য নির্দিষ্ট পথের তথ্য সংরক্ষণ করে - (আপনি যদি এটি বন্ধ করতে চান --no-સંબંધિત বা --no-R ব্যবহার করুন)।

  • --Dirs (-d) বিকল্পটি অন্তর্ভুক্ত করা হয়েছে, যা গন্তব্যস্থলে তালিকায় সুনির্দিষ্টভাবে এড়িয়ে চলার পরিবর্তে তালিকায় নির্দিষ্ট ডিরেক্টরিগুলি তৈরি করবে (আপনি যদি এটি বন্ধ করতে চান --no-dirs বা --no-d ব্যবহার করুন)।

  • --আরচাইভ (-a) বিকল্পের আচরণটি --recursive (-r) বোঝায় না, সুতরাং আপনি যদি এটি চান তবে এটি স্পষ্টভাবে উল্লেখ করুন।

  • এই পার্শ্ব প্রতিক্রিয়াগুলি আরএসইএনসি-র ডিফল্ট অবস্থাকে পরিবর্তন করে, সুতরাং কমান্ড-লাইনের --files-from বিকল্পের অবস্থানের অন্যান্য বিকল্পগুলি কীভাবে পার্স করা যায় তার কোনও প্রভাব নেই (উদাহরণস্বরূপ - একটি --files- এর আগে বা পরে একই কাজ করে) থেকে, যেমন - না-আর এবং অন্যান্য সমস্ত বিকল্প)।

ফাইল থেকে যে ফাইলের নামগুলি পড়া হয় সেগুলি সমস্ত সোর্স ডিরের সাথে সম্পর্কিত - যে কোনও নেতৃস্থানীয় স্ল্যাশগুলি সরানো হয় এবং কোনও ".." রেফারেন্স উত্স দিরের চেয়ে বেশি যেতে দেওয়া হয় না। উদাহরণস্বরূপ, এই আদেশটি নিন:

rsync -a --files-from=/tmp/foo /usr remote:/backup

যদি / tmp / foo এর মধ্যে "বিন" (অথবা "/ বিন") স্ট্রিং থাকে তবে / usr / bin ডিরেক্টরিটি দূরবর্তী হোস্টে / ব্যাকআপ / বিন হিসাবে তৈরি করা হবে। যদি এটিতে "বিন /" থাকে (ট্রেলিং স্ল্যাশটি নোট করুন) তবে ডিরেক্টরিটির তাত্ক্ষণিক বিষয়বস্তুগুলিও প্রেরণ করা হবে (ফাইলটিতে স্পষ্টভাবে উল্লেখ করার প্রয়োজন নেই - এটি সংস্করণ ২.6.৪ এ শুরু হয়েছিল)। উভয় ক্ষেত্রেই, যদি -r বিকল্পটি সক্ষম করা থাকে তবে সেই দির পুরো শ্রেণিবিন্যাসও স্থানান্তরিত হবে (মনে রাখবেন -r -files-from দিয়ে স্পষ্টভাবে নির্দিষ্ট করা দরকার, যেহেতু এটি -a দ্বারা বোঝানো হয়নি)। আরও মনে রাখবেন যে (ডিফল্টরূপে সক্ষম) - সম্পর্কিত বিকল্পটির প্রভাবটি কেবল ফাইলটি থেকে পঠিত পাথের তথ্যটিই নকল করা যায় - এটি উত্স-নির্দিষ্ট পথের নকলকে জোর করে না (এই ক্ষেত্রে usr) ।

এছাড়াও, ফাইলটির সামনে - "ফাইলগুলি" হোস্টের পরিবর্তে স্থানীয় হোস্টের পরিবর্তে রিমোট হোস্ট থেকে পড়তে পারে (হোস্টটি অবশ্যই স্থানান্তরটির এক প্রান্তের সাথে মেলে)। শর্ট-কাট হিসাবে, আপনি "স্থানান্তরটির দূরবর্তী প্রান্তটি ব্যবহার করুন" এর অর্থ ":" এর কেবল একটি উপসর্গ নির্দিষ্ট করতে পারেন। উদাহরণ স্বরূপ:

rsync -a --files-from=:/path/file-list src:/ /tmp/copy

এটি দূরবর্তী "src" হোস্টে অবস্থিত / पथ / ফাইল-তালিকা ফাইলের মধ্যে উল্লিখিত সমস্ত ফাইলের অনুলিপি করবে।

যদি --iconv এবং --Potect-args বিকল্পগুলি নির্দিষ্ট করা থাকে এবং - ফাইল ফাইল থেকে ফাইলগুলি এক হোস্ট থেকে অন্য হোস্টে প্রেরণ করা হয়, তবে ফাইলের নামগুলি প্রেরণকারী হোস্টের অক্ষর থেকে প্রাপ্ত হোস্টের চরসেটে অনুবাদ করা হবে।

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


23
নোট করুন যে আপনি এখনও তালিকাবদ্ধ ফাইলগুলি যেখানে অবস্থিত সেখানে ডিরেক্টরিটি নির্দিষ্ট করতে হবে, উদাহরণস্বরূপ: rsync -av --files-from=file-list . target/বর্তমান দির থেকে ফাইল অনুলিপি করার জন্য।
নিকোলাস ম্যাটিয়া

7
হ্যাঁ, এবং পুনরাবৃত্তি করতে: The filenames that are read from the FILE are all relative to the source dir
ATP

আহ, মিস করলাম, দুঃখিত!
নিকোলাস ম্যাটিয়া

4
যদি ফাইল-থেকে ফাইলটি ..আরএসসিএনসি দিয়ে শুরু করে তবে ..আমার কোনও ত্রুটি প্রদানের বিষয়টি উপেক্ষা করার মতো উপস্থিত হয় rsync: link_stat "/home/michael/test/subdir/test.txt" failed: No such file or directory(এই ক্ষেত্রে "পরীক্ষা" দির থেকে চলছে এবং "../subdir/test.txt" নির্দিষ্ট করার চেষ্টা করছে যা বিদ্যমান
মাইকেল 0

--files-fromযুক্ত এবং অন্তর্ভুক্তের একটি সুস্পষ্ট তালিকার সাথে যুক্তিটি কী একত্রিত করা যেতে পারে এবং তালিকা থেকে থাকা ফাইলগুলি --files-fromবিদ্যমান বর্জনীয় বিধিগুলি ওভাররাইডের সাথে যুক্ত করা হবে , যেমন তারা যদি ফাইলটিতে উপস্থিত হয় তবে সেগুলি অন্তর্ভুক্ত করা হবে?
হাইস্কিগুয়ে

13

--files-from=আপনি যদি পরম পথটি অক্ষত রাখতে চান তবে প্যারামিটারের পিছনে স্ল্যাশ দরকার। সুতরাং আপনার কমান্ড নীচের মত কিছু হয়ে যাবে:

rsync -av --files-from=/path/to/file / /tmp/

এটি করা যেতে পারে যেমন প্রচুর সংখ্যক ফাইল রয়েছে এবং আপনি সমস্ত ফাইলকে x পথে কপি করতে চান। সুতরাং আপনি ফাইলগুলি খুঁজে পেতে এবং নীচের মত একটি ফাইলে আউটপুট নিক্ষেপ করতে হবে:

find /var/* -name *.log > file

9

রেকর্ডের জন্য, উপরের উত্তরগুলির মধ্যে একটিও ব্যতীত কোন উত্তর দেয় না। সংক্ষিপ্তসার হিসাবে, আপনি দুটি ব্যবহার --files-from=করে ব্যাকআপ অপারেশন করতে পারেন :

 rsync -aSvuc `cat rsync-src-فائل`` / mnt / d / rsync_test /

বা

rsync -aSvuc --recursive --files-from = rsync-src- ফাইল। / এমএনটি / ডি / আরএসএনসি_টিস্ট /

পূর্ববর্তী কমান্ডটি স্ব-বর্ণনামূলক, ফাইলটির বিষয়বস্তুর পাশে rsync-src-filesযা আমি নীচে বিশদভাবে বর্ণনা করব। এখন, আপনি যদি পরবর্তী সংস্করণটি ব্যবহার করতে চান তবে আপনাকে নিম্নলিখিত চারটি মন্তব্য মনে রাখা দরকার:

  1. লক্ষ্য করুন যে একটি --files-fromএবং উত্স ডিরেক্টরি উভয়ই নির্দিষ্ট করা দরকার
  2. একটি স্পষ্টভাবে নির্দিষ্ট করা প্রয়োজন --recursive
  3. ফাইলটি rsync-src-filesএকটি ব্যবহারকারী তৈরি করা ফাইল এবং এটি এই পরীক্ষার জন্য এসসিআর ডিরেক্টরিতে স্থাপন করা হয়েছিল
  4. rsyn-src-filesঅনুলিপির ফাইল এবং ফোল্ডার থাকে এবং তারা সোর্স ডিরেক্টরিতে আপেক্ষিক নেয়া হয়। গুরুত্বপূর্ণ: নিশ্চিত করুন যে ফাইলটিতে ফাঁকা স্থান বা ফাঁকা লাইন নেই। নীচের উদাহরণে, কেবল দুটি লাইন রয়েছে, তিনটি নয় (এটি যথাযথভাবে চিত্রিত করুন)। কন্টেন্টrsynch-src-files হ'ল:

ফোল্ডার নাম 1
ফোল্ডার নাম 2


3

আমি অনুরূপ টাস্ক পেয়েছি: প্রদত্ত তারিখের পরে সমস্ত ফাইল সংশোধন করতে, তবে কিছু ডিরেক্টরি বাদ দিয়ে। সামগ্রিকভাবে এক লাইনার তৈরি করা কঠিন ছিল, তাই আমি সমস্যাটিকে ছোট ছোট টুকরো টুকরো করলাম। চূড়ান্ত সমাধান:

find  ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS" | egrep -v "/\..|Downloads|FOO" > FileList.txt
rsync -v --files-from=FileList.txt ~/sourceDIR /Destination

প্রথম আমি ব্যবহার find -L ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS"। আমি নামের ধরণগুলি বাদ দেওয়ার regexজন্য findলাইনে যুক্ত করার চেষ্টা করেছি , তবে লিনাক্স (পুদিনা) এর আমার স্বাদটি রেগেক্সকে না-ই বোঝা উচিত find। পরীক্ষিত সংখ্যক রেগেক্স স্বাদ - পছন্দসই হিসাবে কাজ নয়। সুতরাং আমি সমাপ্তি egrep -v- বিকল্পটি প্যাটার্ন সহজ উপায় বাদ দেয়। আমার / cache বা / config প্লাসের rsyncমতো আমি স্পষ্টভাবে নামকরণ করা অন্য কোনও ডিরেক্টরি অনুলিপি করছি না ।


4
আমি বিশ্বাস করি আপনি এটিকে bashওয়ান-লাইনারে পরিণত করতে প্রক্রিয়া বিকল্প ব্যবহার করতে পারেন :rsync -v --files-from=<(find ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS" | grep -Ev "/\..|Downloads|FOO") ~/sourceDIR /Destination
পিএইচকে

2
$ date
  Wed 24 Apr 2019 09:54:53 AM PDT
$ rsync --version
  rsync  version 3.1.3  protocol version 31
  ...

বাক্য গঠন: rsync <file_/_folder_list> <source> <target>

ফোল্ডারের নাম (এখানে, একটি পিছনের সাথে /; উদাহরণস্বরূপ Cancer - Evolution/) একটি ফোল্ডার তালিকা ফাইলে রয়েছে (যেমন: সেমি_ফোল্ডার_লিস্ট_টেষ্ট):

# /mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test
# test file: 2019-04-24
Cancer/
Cancer - Evolution/
Cancer - Genomic Variants/
Cancer - Metastasis (EMT Transition ...)/
Cancer Pathways, Networks/
Catabolism - Autophagy; Phagosomes; Mitophagy/
Catabolism - Lysosomes/

আপনি যদি /এই পেছনটি অন্তর্ভুক্ত না করেন তবে rsync'd লক্ষ্য ফোল্ডারগুলি তৈরি করা হলেও খালি রয়েছে।

এই ফোল্ডারগুলির নামগুলি তাদের বাকী ( /home/victoria/Mail/2_RESEARCH - NEWS) পথের সাথে যুক্ত করা হয়েছে , এইভাবে rsync এ সম্পূর্ণ ফোল্ডার পাথ সরবরাহ করে; উদাহরণ: /home/victoria/Mail/2_RESEARCH - NEWS/Cancer - Evolution/

মনে রাখবেন যে আপনারও ব্যবহার করা দরকার --files-from= ..., না --include-from=...

rsync -aqP --delete --files-from=/mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test "/home/victoria/Mail/2_RESEARCH - NEWS" $IN/

(আমার বেস স্ক্রিপ্টে, আমি ভেরিয়েবল সংজ্ঞায়িত করেছি $IN নিম্নলিখিত হিসাবে ।)

BASEDIR="/mnt/Vancouver/projects/ie/claws"
IN=$BASEDIR/data/test/input

rsync বিকল্পগুলি ব্যবহার করা হয়েছে:

 -a  :   archive: equals -rlptgoD (no -H,-A,-X)
    -r  :   recursive
    -l  :   copy symlinks as symlinks
    -p  :   preserve permissions
    -t  :   preserve modification times 
    -g  :   preserve group 
    -o  :   preserve owner (super-user only) 
    -D  :   same as --devices --specials 
  -q  :   quiet (/server/547106/run-totally-silent-rsync)

  --delete
    This  tells  rsync to delete extraneous files from the RECEIVING SIDE (ones
    that AREN’T ON THE SENDING SIDE), but only for the directories that are
    being synchronized.  You must have asked rsync to send the whole directory
    (e.g.  "dir" or "dir/") without using a wildcard for the directory’s contents
    (e.g. "dir/*") since the wildcard is expanded by the shell and rsync thus
    gets a request to transfer individual files, not the files’ parent directory.
    Files  that  are  excluded  from  the transfer are also excluded from being
    deleted unless you use the --delete-excluded option or mark the rules as
    only matching on the sending side (see the include/exclude modifiers in the
    FILTER RULES section).  ...

1

এই উত্তরটি প্রশ্নের সরাসরি উত্তর নয়। তবে এটি আপনার সমস্যার জন্য কোন সমাধানটি সবচেয়ে ভাল ফিট করে তা নির্ধারণে আপনাকে সহায়তা করা উচিত।

সমস্যাটি বিশ্লেষণ করার সময় আপনার ডিবাগ বিকল্পটি সক্রিয় করা উচিত -vv

তারপরে আরএসসিএনসি আউটপুট দেয় কোন ফাইলগুলিকে কোন প্যাটার্ন দ্বারা অন্তর্ভুক্ত বা বাদ দেওয়া হয়েছে:

building file list ... 
[sender] hiding file FILE1 because of pattern FILE1*
[sender] showing file FILE2 because of pattern *

0

এই সমস্ত উত্তর আমার পক্ষে কাজ করেনি, যখন আমার কাছে সমস্ত ছিল ডিরেক্টরিগুলির একটি তালিকা । আমি তখন হোঁচট খেয়েছি সমাধান! আপনাকে যুক্ত -rকরতে হবে --files-fromকারণ -aএই দৃশ্যে পুনরাবৃত্তি হবে না (কে জানত ?!)।

rsync -aruRP --files-from=directory.list . ../new/location

আপনি যদি ফাইলটিতে "dir" তালিকাভুক্ত করেন তবে আপনাকে -r / crecursive নির্দিষ্ট করতে হবে; যদি আপনি "দির /" তালিকাভুক্ত করেন তবে আপনি করবেন না।
lbutlr
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.