নির্দিষ্ট ডিরেক্টরি বাদ দিতে 'সিপি' কমান্ড কিভাবে ব্যবহার করবেন?


410

আমি একটি নির্দিষ্ট সাব ডিরেক্টরিতে কিছু ফাইল বাদে ডিরেক্টরিতে সমস্ত ফাইল অনুলিপি করতে চাই। আমি লক্ষ্য করেছি যে 'cp' কমান্ডের - - এক্সক্লুড বিকল্প নেই। সুতরাং, আমি কীভাবে এটি অর্জন করতে পারি?



6
tar -c | tar -x?
এমভিডিস

1
@ এমভিডিএস, আপনার সাথে একমত, '- এক্সক্লুড' এর সাথে টার ব্যবহার করা ভাল ধারণা।
হুয়াং এফ। লেই

উত্তর:


702

rsync দ্রুত এবং সহজ:

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude

আপনি --excludeবহুগুণ ব্যবহার করতে পারেন ।

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude

নোট করুন যে বিকল্প thefoldertoexcludeপরে dir --excludeঅপেক্ষাকৃত sourcefolder, যেমন sourcefolder/thefoldertoexclude

এছাড়াও আপনি -nশুষ্ক রানের জন্য যুক্ত করতে পারেন আসল অপারেশন করার আগে কী অনুলিপি করা হবে তা দেখতে এবং যদি সবকিছু ঠিক থাকে তবে -nকমান্ড লাইন থেকে সরান from


3
সম্মত, আপনি এর সরলতা এবং শক্তিকে পরাজিত করতে পারবেন না--exclude
ম্যাথু উইলকক্সসন

31
হয় thefoldertoexcludeআপেক্ষিক sourcefolderঅথবা বর্তমান কাজের Dir? ধন্যবাদ
বিবি

46
এটি উত্স ফোল্ডারের তুলনায়। এটি ফোল্ডার উত্স / .git অনুলিপি করা থেকে বাদ দেবে। rsync -r --excolve '.git' উত্স লক্ষ্য
অরকোডেন

15
হতে পারে আমি ভুল তবে আমার মনে হয় "পরামিতিগুলির" আগে "সুইচগুলি" যুক্ত করা একটি ভাল অনুশীলন। এছাড়াও আরএসআইএনসি রিপোর্টের ম্যান পেজ - "=" সিনট্যাক্সের সাথে বা তার বাইরে ব্যবহারযোগ্য ex সুতরাং অপারেটিং সিস্টেমগুলি জুড়ে স্ট্যান্ডারাইজ করার জন্য, আমি ব্যবহার করব rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder- যাইহোক, সন্ধানের পরিবর্তে আরএসসিএনসিটির জন্য আপগ্রেট করুন, কারণ আপনি সহজেই উত্সটির জন্য নিখুঁত পাথগুলি ব্যবহার করতে পারেন যখন এটি ডিএসটি-তে ব্যবহার করা {}জটিল।
জাভি মন্টেরো

1
@ মামুন অবশ্যই যেমন দূরবর্তী সার্ভার থেকে লোকাল মেশিনে: $ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/অথবা স্থানীয় থেকে দূরবর্তী$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
sobi3ch

84

ঠিক আছে, যদি প্রতিটি ফাইলের নাম নিদর্শনগুলি বাদ দিয়ে প্রতিটি ইউনিক্স-ইশ ফাইলের ইউটিলিটি (সিপি, এমভি, আরএম, টার, আরএসএনসি, স্কিপ, ...) দ্বারা সম্পাদন করা হয়, তবে প্রচেষ্টার একটি অনুলিপি ঘটতে পারে। পরিবর্তে, এই জাতীয় জিনিসগুলি গ্লোববিংয়ের অংশ হিসাবে করা যেতে পারে , যেমন আপনার শেল দ্বারা।

সজোরে আঘাত

man 1 bash, / Extglob

উদাহরণ:

t শপট-এক্স এক্সগ্লোব
$ প্রতিধ্বনি ইমেজ / *
ইমেজ / 004.bmp ইমেজ / 033.jpg চিত্র / 1276338351183.jpg চিত্র / 2252.png
$ প্রতিধ্বনি ইমেজ /! (*। জেপিজি)
চিত্রগুলি / 004.bmp চিত্র / 2252.png

সুতরাং আপনি কেবল একটি অভ্যন্তর ভিতরে রেখেছেন !()এবং এটি ম্যাচটিকে উপেক্ষা করে। প্যাটার্নটি নির্বিচারে জটিল হতে পারে, পৃথক পাথের গণনা থেকে শুরু করে (যেমন ভানওয়ারিল অন্য উত্তরে দেখায়): !(filename1|path2|etc3)তারা এবং চরিত্রের ক্লাসগুলির সাথে রেজেক্সের মতো জিনিসগুলি to বিশদ জন্য ম্যানপেজ দেখুন।

zsh

man 1 zshexpn, / ফাইলের নাম উত্পাদন

আপনি setopt KSH_GLOBব্যাশ-জাতীয় প্যাটার্নগুলি করতে এবং ব্যবহার করতে পারেন । অথবা,

% সেটআপ্ট EXTENDED_GLOB
% ইকো ইমেজ / *
ইমেজ / 004.bmp ইমেজ / 033.jpg চিত্র / 1276338351183.jpg চিত্র / 2252.png
% প্রতিধ্বনি চিত্র / * ~ * .jpg
চিত্রগুলি / 004.bmp চিত্র / 2252.png

সুতরাং x~yপ্যাটার্নের সাথে মেলে xতবে প্যাটার্নটি বাদ দেয় y। আবারও, সম্পূর্ণ বিবরণের জন্য ম্যানপেজটি দেখুন।


নতুন মাছ !

মাছ শেল টি অনেক সুন্দর উত্তর এই হবে:

🐟 সিপি (স্ট্রিং ম্যাচ-ভি '*। এক্সক্লুড.নেমস' - এসসিআরডিডিআর / *) ডাস্টডির

বোনাস প্রো-টিপ

টাইপ করুন cp *, হিট করুন CtrlX*এবং কেবল কী ঘটে তা দেখুন। আমি ক্ষতিপূরণ করছি এটি ক্ষতিকারক নয়


@ মিখাইলগলুবতসভ সম্ভবত এটি কারণ হ'ল গ্লোববিং পুনরাবৃত্ত হয় না এবং একসাথে এক স্তরে কাজ করে। সম্পাদিত PS: zshযদিও এটি কাজ করে ।
ulidtko

3
ভাল প্রো টিপ! এইভাবে আপনি একক আইটেমগুলি সহজেই মুছে ফেলতে পারেন। অনেক ধন্যবাদ!
তাফিত

বিটিডাব্লু, বাশে বর্ধিত প্যাটার্ন মেলানো বৈশিষ্ট্যগুলি বন্ধ করতে, চালান setopt -u extglob
রক্যালাইট

49

rsyncআপনি যখন করতে পারেন তখন কেন ব্যবহার করবেন:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

এটি লক্ষ্য করে যে ডিরেক্টরি নির্দেশিকাটি উত্সের মতোই রয়েছে।


8
আমি মনে করি আপনার -pathনামের নয়, পাথের স্তরক্রম পরীক্ষা করার পক্ষে যুক্তিটি দরকার
জেমস

3
এবং আপনার শেষের দিকে একটি আধা- find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
কোলনেরও দরকার হবে

1
বাহ, এটি আমাকে দেয় না: "সম্পাদনাগুলি কমপক্ষে 6 টি অক্ষর হতে হবে"!
ম্যাথু উইলকক্সসন

1
পুনঃটুইট আপনি কিছুটা বেশি খ্যাতি অর্জনের সাথে সাথে এই বিধিনিষেধগুলি সরিয়ে নেওয়া হবে। আমি সেই অনুযায়ী উত্তরটি সম্পাদনা করেছি। আবার ধন্যবাদ!
লিনাস ক্লিন

1
@ কেন হেন না rsync? কোজে এটি সিস্টেমে উপস্থিত নাও থাকতে পারে! যখন find, cpসর্বদা তাদের জায়গায় থাকে। বা আপনি এমন লোকের কাছ থেকে, যারা সাধারণ কাজ করতে 2gigs স্টাফ ইনস্টল করেছেন?
রিশিন

37
cp -r `ls -A | grep -v "c"` $HOME/

1
উইন্ডোজ 10
.sh

শেল ফাংশন তৈরি করেছে যা কাস্টম উত্স পাথ এবং কেবলমাত্র একটি ফাইল বা ডিরেক্টরি বাদ দেওয়ার জন্য ব্যবহারকে সহজ করে # $1 = source path # $2 = destination path # $3 = filter copy_from_source_to_destination_except_filter() { cp -r $(ls -A $1 | grep -v -w $3 | awk -v path=$1 '{printf "%s/%s ", path, $1}') $2 }
তোলে

স্পেস সহ ডিরেক্টরিতে ব্যর্থ হয়
সেরজিও

27

সবচেয়ে সহজ উপায়টি আমি খুঁজে পেয়েছি, যেখানে আপনি কেবলমাত্র প্রথম বন্ধনীতে নাম যুক্ত করে ফাইল এবং ফোল্ডারগুলি বাদ দিয়ে সমস্ত ফাইল অনুলিপি করতে পারেন:

shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/

9
আমার জন্য কাজ করে না। আমি পেয়েছি-bash: !: event not found
জেনোমার

8
শপট-এক্স এক্সগ্লোব (সিপি, আরএম এবং অন্যান্যগুলিতে সক্ষম করার জন্য এটি
সম্পাদন করুন



8

rsync

rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/

এবং প্রথমে এটি অনুলিপি করে দেখুন কী অনুলিপি হচ্ছে তা দেখতে


শীর্ষ উত্তরের তুলনায় পার্থক্য / উন্নতি কী?
কার্যকলাপ হ্রাস করা

7

আমি ধরে নিচ্ছি আপনি ব্যাশ বা ড্যাশ ব্যবহার করছেন। এই কাজ করবে?

shopt -s extglob  # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination

আপনি চান না এমন ফাইলগুলি বাদ দিয়ে একটি এলএস করছেন, এবং এটি সিপির প্রথম আর্গুমেন্ট হিসাবে ব্যবহার করছেন


9
আপনি অতিরিক্ত এড়ানো lsএবং সহজভাবে করতে পারেন cp !(file1|file1) dest
শন চিন

-LaR ব্যবহার করবেন না। এটি স্ট্রিং যুক্ত করে যা সিপিতে হস্তক্ষেপ করে। cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
LAL

5

আর একটি সহজ বিকল্প হ'ল আরএসইএনসি ইনস্টল ও ব্যবহার করা যার একটি --excule-dir বিকল্প রয়েছে এবং এটি স্থানীয় এবং দূরবর্তী উভয় ফাইলের জন্য ব্যবহার করা যেতে পারে।


4

rsyncআসলে বেশ জটিল। এটি কার্যকর করতে একাধিক পরীক্ষা করতে হবে।

আসুন আপনি অনুলিপি করতে চান বলে /var/www/htmlকরতে /var/www/devকিন্তু করার প্রয়োজনীয়তা অগ্রাহ্য /var/www/html/site/video/ তার আকার কারণে হয়তো ডিরেক্টরি। আদেশটি হ'ল:

rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev

কিছু সতর্কতা :

  1. উত্সটিতে শেষ স্ল্যাশ /প্রয়োজন, অন্যথায় এটি উত্স ডিরেক্টরিটি এর বিষয়বস্তুর পরিবর্তে অনুলিপি করবে এবং হয়ে যাবে/var/www/dev/html/xxxx যা সম্ভবত আপনি চান না।
  2. --excludeপথ আপেক্ষিক উৎস সরাসরি। এমনকি যদি আপনি সম্পূর্ণ পরম পথ রাখেন তবে এটি কার্যকর হবে না।

  3. -vভার্বোজের -aজন্য, সংরক্ষণাগার মোডের জন্য যার অর্থ আপনি পুনরাবৃত্তি চান এবং প্রায় সব কিছু সংরক্ষণ করতে চান ।


একটি সাধারণ সমাধান যা বিশেষ অক্ষর এবং সাদা জায়গাগুলির যত্ন নেয়
সেরজিও

প্যারামিটারগুলি ব্যাখ্যা করার জন্য ধন্যবাদ, বর্তমান শীর্ষের উত্তরের মত নয়!
কার্যকলাপ হ্রাস

3
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir

সম্পাদনা: লক্ষ্য পথটি বাদ দিতেও ভুলে গেছেন (অন্যথায় এটি পুনরাবৃত্তি করে অনুলিপি করতে হবে)।


4
স্পেস ধারণকারী ডিরেক্টরি এন্ট্রি জন্য সন্ধান করুন।
পাওলো স্কার্ডাইন

3

এটি লিনাস ক্লিনের উত্তরের একটি পরিবর্তন। তার উত্তর আমার পক্ষে কাজ করেনি কারণ একটি থাকবে। সিপি পছন্দ করে না এমন ফাইল পাথের সামনে যুক্ত করা হয়েছে (পাথটি উত্স / .destination / ফাইলের মতো দেখাবে)।

এই আদেশটি আমার পক্ষে কাজ করেছে:

find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;

--parents কমান্ড ডিরেক্টরি কাঠামো সংরক্ষণ করে।


2

সাময়িকভাবে এটিকে কোনও লুকানো ডিরেক্টরিতে স্থানান্তর করুন (এবং চাইলে এর পুনরায় নামকরণ করুন)।

mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname

1
সুন্দর নাও হতে পারে - তবে আমি এখানে একমাত্র বিকল্পটি খুঁজে পেয়েছি যা এর সাথে কাজ করে cpএবং একটি স্ট্যান্ডার্ড পসিক্স শেল পছন্দ করে sh
টমেকিভি

1
এই উত্তরটি নাটকীয়ভাবে আন্ডাররেটেড। এটি সর্বাধিক সামঞ্জস্যপূর্ণ, পড়ার পক্ষে সহজ এবং বোঝার জন্য সহজ উত্তর। কুডোস, আমি কেন জানি না তা জানি না।
রবার্ট তালদা

ধন্যবাদ @ রবার্টটাড্ডা, এখন থেকে উত্তরটি কতদূর যাবে? 🌈‍🌈
লামা 12345


0

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

    find . -type f -iname "*.flac" -o -print0 -iname "*.mp3" -print0 -o -iname "*.wav" -print0 -o -iname "*.aac" -print0 -o -iname "*.wma" -print0 | while read -d $'\0' file; do cp -ruv "$file" "/media/wd/network_sync/music/$file"; done

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

    rsync -av --progress --exclude=*.VOB --exclude=*.avi --exclude=*.mkv --exclude=*.ts --exclude=*.mpg --exclude=*.iso --exclude=*ar --exclude=*.vob --exclude=*.BUP --exclude=*.cdi --exclude=*.ISO --exclude=*.shn --exclude=*.MPG --exclude=*.AVI --exclude=*.DAT --exclude=*.img --exclude=*.nrg --exclude=*.cdr --exclude=*.bin --exclude=*.MOV --exclude=*.goutputs* --exclude=*.flv --exclude=*.mov --exclude=*.m2ts --exclude=*.cdg --exclude=*.IFO --exclude=*.asf --exclude=*.ite /media/2TB\ Data/data/music/* /media/wd/network_sync/music/

0
ls -I "filename1" -I "filename2" | xargs cp -rf -t destdir 

প্রথম অংশে lsসমস্ত ফাইল তবে পতাকা সহ নির্দিষ্ট ফাইল লুকানো আছে -I। এর আউটপুট lsদ্বিতীয় অংশের জন্য স্ট্যান্ডার্ড ইনপুট হিসাবে ব্যবহৃত হয়। স্ট্যান্ডার্ড ইনপুট থেকে xargsকমান্ড বিল্ড এবং এক্সিকিউট cp -rf -t destdirকরুন। পতাকাটির -rঅর্থ হ'ল অনুলিপি ডিরেক্টরিগুলি অনুলিপি করা, -fঅর্থ জোর করে ফাইলগুলি অনুলিপি করা যা ফাইলগুলিতে ওভাররাইট করে destdir, -tগন্তব্য ডিরেক্টরি কপিটি নির্দিষ্ট করে।


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