আমি একটি নির্দিষ্ট সাব ডিরেক্টরিতে কিছু ফাইল বাদে ডিরেক্টরিতে সমস্ত ফাইল অনুলিপি করতে চাই। আমি লক্ষ্য করেছি যে 'cp' কমান্ডের - - এক্সক্লুড বিকল্প নেই। সুতরাং, আমি কীভাবে এটি অর্জন করতে পারি?
tar -c | tar -x
?
আমি একটি নির্দিষ্ট সাব ডিরেক্টরিতে কিছু ফাইল বাদে ডিরেক্টরিতে সমস্ত ফাইল অনুলিপি করতে চাই। আমি লক্ষ্য করেছি যে 'cp' কমান্ডের - - এক্সক্লুড বিকল্প নেই। সুতরাং, আমি কীভাবে এটি অর্জন করতে পারি?
tar -c | tar -x
?
উত্তর:
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
--exclude
thefoldertoexclude
আপেক্ষিক sourcefolder
অথবা বর্তমান কাজের Dir? ধন্যবাদ
rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder
- যাইহোক, সন্ধানের পরিবর্তে আরএসসিএনসিটির জন্য আপগ্রেট করুন, কারণ আপনি সহজেই উত্সটির জন্য নিখুঁত পাথগুলি ব্যবহার করতে পারেন যখন এটি ডিএসটি-তে ব্যবহার করা {}
জটিল।
$ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/
অথবা স্থানীয় থেকে দূরবর্তী$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
ঠিক আছে, যদি প্রতিটি ফাইলের নাম নিদর্শনগুলি বাদ দিয়ে প্রতিটি ইউনিক্স-ইশ ফাইলের ইউটিলিটি (সিপি, এমভি, আরএম, টার, আরএসএনসি, স্কিপ, ...) দ্বারা সম্পাদন করা হয়, তবে প্রচেষ্টার একটি অনুলিপি ঘটতে পারে। পরিবর্তে, এই জাতীয় জিনিসগুলি গ্লোববিংয়ের অংশ হিসাবে করা যেতে পারে , যেমন আপনার শেল দ্বারা।
man 1 bash
, / Extglob ।
উদাহরণ:
t শপট-এক্স এক্সগ্লোব $ প্রতিধ্বনি ইমেজ / * ইমেজ / 004.bmp ইমেজ / 033.jpg চিত্র / 1276338351183.jpg চিত্র / 2252.png $ প্রতিধ্বনি ইমেজ /! (*। জেপিজি) চিত্রগুলি / 004.bmp চিত্র / 2252.png
সুতরাং আপনি কেবল একটি অভ্যন্তর ভিতরে রেখেছেন !()
এবং এটি ম্যাচটিকে উপেক্ষা করে। প্যাটার্নটি নির্বিচারে জটিল হতে পারে, পৃথক পাথের গণনা থেকে শুরু করে (যেমন ভানওয়ারিল অন্য উত্তরে দেখায়): !(filename1|path2|etc3)
তারা এবং চরিত্রের ক্লাসগুলির সাথে রেজেক্সের মতো জিনিসগুলি to বিশদ জন্য ম্যানপেজ দেখুন।
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*এবং কেবল কী ঘটে তা দেখুন। আমি ক্ষতিপূরণ করছি এটি ক্ষতিকারক নয়
zsh
যদিও এটি কাজ করে ।
setopt -u extglob
।
rsync
আপনি যখন করতে পারেন তখন কেন ব্যবহার করবেন:
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
এটি লক্ষ্য করে যে ডিরেক্টরি নির্দেশিকাটি উত্সের মতোই রয়েছে।
-path
নামের নয়, পাথের স্তরক্রম পরীক্ষা করার পক্ষে যুক্তিটি দরকার
find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
rsync
? কোজে এটি সিস্টেমে উপস্থিত নাও থাকতে পারে! যখন find
, cp
সর্বদা তাদের জায়গায় থাকে। বা আপনি এমন লোকের কাছ থেকে, যারা সাধারণ কাজ করতে 2gigs স্টাফ ইনস্টল করেছেন?
cp -r `ls -A | grep -v "c"` $HOME/
# $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 }
সবচেয়ে সহজ উপায়টি আমি খুঁজে পেয়েছি, যেখানে আপনি কেবলমাত্র প্রথম বন্ধনীতে নাম যুক্ত করে ফাইল এবং ফোল্ডারগুলি বাদ দিয়ে সমস্ত ফাইল অনুলিপি করতে পারেন:
shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/
-bash: !: event not found
উপর সম্প্রসারিত mvds এর মন্তব্য , এই আমার জন্য কাজ করে
cd dotfiles
tar -c --exclude .git --exclude README . | tar -x -C ~/dotfiles2
এটি উত্স ডিরেক্টরি সম্পর্কিত।
এটি ডিরেক্টরিটি source/.git
অনুলিপি করা থেকে বাদ দেবে ।
rsync -r --exclude '.git' source target
rsync
rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/
এবং প্রথমে এটি অনুলিপি করে দেখুন কী অনুলিপি হচ্ছে তা দেখতে
আমি ধরে নিচ্ছি আপনি ব্যাশ বা ড্যাশ ব্যবহার করছেন। এই কাজ করবে?
shopt -s extglob # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination
আপনি চান না এমন ফাইলগুলি বাদ দিয়ে একটি এলএস করছেন, এবং এটি সিপির প্রথম আর্গুমেন্ট হিসাবে ব্যবহার করছেন
ls
এবং সহজভাবে করতে পারেন cp !(file1|file1) dest
।
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
rsync
আসলে বেশ জটিল। এটি কার্যকর করতে একাধিক পরীক্ষা করতে হবে।
আসুন আপনি অনুলিপি করতে চান বলে /var/www/html
করতে /var/www/dev
কিন্তু করার প্রয়োজনীয়তা অগ্রাহ্য /var/www/html/site/video/
তার আকার কারণে হয়তো ডিরেক্টরি। আদেশটি হ'ল:
rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev
কিছু সতর্কতা :
/
প্রয়োজন, অন্যথায় এটি উত্স ডিরেক্টরিটি এর বিষয়বস্তুর পরিবর্তে অনুলিপি করবে এবং হয়ে যাবে/var/www/dev/html/xxxx
যা সম্ভবত আপনি চান না।--exclude
পথ আপেক্ষিক উৎস সরাসরি। এমনকি যদি আপনি সম্পূর্ণ পরম পথ রাখেন তবে এটি কার্যকর হবে না।
-v
ভার্বোজের -a
জন্য, সংরক্ষণাগার মোডের জন্য যার অর্থ আপনি পুনরাবৃত্তি চান এবং প্রায় সব কিছু সংরক্ষণ করতে চান ।
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir
সম্পাদনা: লক্ষ্য পথটি বাদ দিতেও ভুলে গেছেন (অন্যথায় এটি পুনরাবৃত্তি করে অনুলিপি করতে হবে)।
এটি লিনাস ক্লিনের উত্তরের একটি পরিবর্তন। তার উত্তর আমার পক্ষে কাজ করেনি কারণ একটি থাকবে। সিপি পছন্দ করে না এমন ফাইল পাথের সামনে যুক্ত করা হয়েছে (পাথটি উত্স / .destination / ফাইলের মতো দেখাবে)।
এই আদেশটি আমার পক্ষে কাজ করেছে:
find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;
--parents কমান্ড ডিরেক্টরি কাঠামো সংরক্ষণ করে।
সাময়িকভাবে এটিকে কোনও লুকানো ডিরেক্টরিতে স্থানান্তর করুন (এবং চাইলে এর পুনরায় নামকরণ করুন)।
mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname
cp
এবং একটি স্ট্যান্ডার্ড পসিক্স শেল পছন্দ করে sh
।
আমি ফাইন্ড কমান্ডের আউটপুট পড়তে "ডু থল" লুপ ব্যবহার করি। এই উদাহরণে, আমি নির্দিষ্ট নিদর্শনগুলির সাথে মিলে যাচ্ছি (বাদ না দিয়ে) যেহেতু আমি চাই না তার চেয়ে অনেক বেশি সীমিত সংখ্যক প্যাটার্ন মিল রয়েছে। -নাম পতাকার সামনে আপনি নোট দিয়ে যুক্তিটি বিপরীত করতে পারেন:
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/
ls -I "filename1" -I "filename2" | xargs cp -rf -t destdir
প্রথম অংশে ls
সমস্ত ফাইল তবে পতাকা সহ নির্দিষ্ট ফাইল লুকানো আছে -I
। এর আউটপুট ls
দ্বিতীয় অংশের জন্য স্ট্যান্ডার্ড ইনপুট হিসাবে ব্যবহৃত হয়। স্ট্যান্ডার্ড ইনপুট থেকে xargs
কমান্ড বিল্ড এবং এক্সিকিউট cp -rf -t destdir
করুন। পতাকাটির -r
অর্থ হ'ল অনুলিপি ডিরেক্টরিগুলি অনুলিপি করা, -f
অর্থ জোর করে ফাইলগুলি অনুলিপি করা যা ফাইলগুলিতে ওভাররাইট করে destdir
, -t
গন্তব্য ডিরেক্টরি কপিটি নির্দিষ্ট করে।
cp -r ls -A | grep -v "Excluded_File_or_folder"
../$target_location -v