সমস্ত 'ডটফিল' সহ ট্যার ব্যবহার করে সংরক্ষণাগার তৈরি করা তবে সমস্ত উপ ডিরেক্টরি এবং / ডু ডিরেক্টরি কাঠামো বাদ দিয়ে


18

আমি সব 'dotfiles' (ফে ব্যাকআপ করতে চান .zshrc) সঙ্গে আমার home ডিরেক্টরির অধীনে আলকাতরা কিন্তু ডিরেক্টরি গঠন এবং সমস্ত সাব-ব্যতীত।

আমি এটি বিভিন্ন কমান্ড দিয়ে বেশ কয়েকবার চেষ্টা করেছি, তবে আমি প্রাপ্ত সেরাটি একটি সংরক্ষণাগার ছিল যার মধ্যে লুকানো ডিরেক্টরিগুলিও অন্তর্ভুক্ত $HOMEছিল।

#!/bin/zsh
BACKUPFILE=dotfile_backup.tar.gz
tar --create --file=$HOME/$BACKUPFILE --auto-compress --no-recursion --exclude=. --exclude=.. --exclude=*/ --directory=$HOME .*

আমি findফলাফলটি টর্কে ব্যবহার করার এবং পাইপ দেওয়ার বিষয়েও ভেবেছিলাম , তবে কোনও ভাগ্য নেই। আপাতদৃষ্টিতে সহজ - টাস্কটি কীভাবে এটি অর্জন করা যায় তা কি কেউ জানেন?

পিএস: বেশিরভাগ সময় যখন আমি একটি সংরক্ষণাগার তৈরি করতে টার ব্যবহার করি তখন আমাকে xkcd কমিক সম্পর্কে ভাবতে হবে:

xkcd 1168 :)


সিমের উত্তর কাজ করে, তবে যদি কারও কাছে একটি রেজেেক্স পাওয়া যায় যা কেবলমাত্র লুকানো ফাইলগুলির সাথে মেলে, তবে এটি পোস্ট করুন!
ক্লিংটনেট

1
অবশ্যই এটি আপনার শেল দিয়ে আরও ভাল অর্জন করা হবে। আমি বুঝি যে zsh globs যে শুধুমাত্র ফাইল নির্বাচন আছে - *(.)- এবং আমি তা বাদ মনে .এবং ..থেকে .*ডিফল্টরূপে (এবং তারা দ্বারা কুড়ান হবে না .*(.)যাহাই হউক না কেন, যেহেতু এটি শুধুমাত্র ফাইল নির্বাচন)। আমি নিজে zsh ব্যবহার করি না, তাই এটিকে উত্তরে রূপান্তর করার পক্ষে আমি যথেষ্ট নিশ্চিত নই।
কুফলসপ

উত্তর:


14

আপনি এই নির্দেশটি .<something>আপনার $HOMEডিরেক্টরিতে আপনার সমস্ত ডটফাইল ( ) ব্যাকআপ করতে ব্যবহার করতে পারেন :

$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +

রেগেক্স কি শুধু টার ব্যবহার করছেন?

পদ্ধতি # 1

আমি এটি বেশ কিছুটা গবেষণা করে খালি এসেছি। সীমাবদ্ধ ফ্যাক্টরটি tarহ'ল যে যখন এটি সম্পাদন করা হয় তখন এটি বাদ দেয়, /যখন ট্রেয়ার তার প্যাটার্ন ম্যাচটি সম্পাদন করে তখন ডিরেক্টরিগুলির সাথে প্রদর্শিত ট্রেলিং স্ল্যাশ ( ) সমীকরণের অংশ হয় না।

এখানে একটি উদাহরণ:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory

এই রূপটিতে একটি বাদ দেওয়া রয়েছে .*/এবং আপনি দেখতে পাচ্ছেন ভার্বোস সুইচটি টারে চালু হয়েছে -v, যে এই ডিরেক্টরিগুলি সেই বাদ দিয়ে চলেছে।

পদ্ধতি # 2

আমি ভেবেছিলাম সম্ভবত সুইচগুলি --no-wildcards-match-slashবা --wildcards-match-slashএর লোভকে শিথিল করবে তবে এটির .*/কোনও প্রভাবও ছিল না।

অগ্রাহ্য বাইরে স্ল্যাশ গ্রহণ, .*একটি বিকল্প হয় যেহেতু যে জানিয়ে দেবে ছিল না tarসব dotfiles এবং dotdirectories বাদ দেওয়ার:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$

পদ্ধতি # 3 (কুরুচিপূর্ণ!)

সুতরাং কেবলমাত্র অন্য বিকল্পটি আমি ধারণ করতে পারি তা হল ফাইলগুলির একটি তালিকা সরবরাহ করা tar। এটার মতো কিছু:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory

কোনও কমান্ডের কাছে আর্গুমেন্টগুলি পাস করার জন্য ফাইলের সংখ্যা সর্বাধিক পরিমাণের চেয়ে বেশি হলে এই পদ্ধতির সমস্যা রয়েছে would অন্যটি এটি কুরুচিপূর্ণ এবং অত্যধিক জটিল।

তাহলে আমরা কি শিখেছিলাম?

এটি tarনিয়মিত এবং এক্সপ্রেশন ব্যবহার করে এটি সম্পাদন করার কোনও সোজা-সামনের এবং মার্জিত উপায় বলে মনে হয় না । @ টেরডনের মন্তব্য হিসাবে, find ... | tar ...এটি করার পক্ষে আরও উপযুক্ত উপায়।


আমি সত্যিই এটি দিয়ে কাজটি করতে চেয়েছিলাম regex, তবে আমার জানা উচিত ছিল যে এটি সেভাবে কাজ করবে না :)
klingt.net

@ ক্লিংটটনেট - এটি সম্ভব হওয়া উচিত, আমি এখন খুঁজছি।
slm

@ ক্লিংটটনেট: আপনি কেন আরও জটিল উপায়ে পছন্দ করবেন? ব্যবহার regexআপনি সম্ভবত নেতৃস্থানীয় ডট অব্যাহতি এবং কষ্ট উপেক্ষা থাকবে প্রয়োজন হবে .এবং ..। আমি নিশ্চিত যে এটি সম্ভব যেমন স্ল্যাম সম্ভবত প্রদর্শিত হবে তবে কেন তা সার্থক হবে তা আমি দেখছি না।
টেরডন

1
@ ক্লিংটটনেট - findকমান্ড যা কিছু আবিষ্কার করে সেটিকে আর্গুমেন্ট হিসাবে পাস করেছে tar{}আপনি যে ফলাফলগুলি চান সেখানে সংশ্লিষ্ট -execকমান্ডে যেতে চান বলেছে The +থেকে অনেক ফলাফল হিসাবে যোগ করার জন্য বলছেন findযেমন কমান্ড লাইন মাপসই করা হবে এবং ডাকব tarবরং প্রত্যেক সময় এর ফলে পাওয়া যায় চেয়ে সময়ের শুধুমাত্র একটি দম্পতি।
slm

1
@ ক্লিংটটনেট - এটি ব্যবহার করে কাজ করার কোনও উপায় নেই regexএবং tarকারণ ডট ডিরেক্টরিগুলি ( .blah/) আলাদা করার কোনও উপায় নেই । বাদ না রেখে টার পিছনের স্ল্যাশ ব্যবহার করে না।
slm

4

মেলানো ফাইলগুলির উপর এই ধরণের নিয়ন্ত্রণ হ'ল টারের আরাম অঞ্চলের বাইরে। ফাইলগুলির সাথে মিলে যাওয়ার জন্য এর বিধিগুলি নামগুলির সাথে সাধারণ ম্যাচে সীমাবদ্ধ।

find একটি উপায়, তবে যেহেতু আপনার কাছে জেডএস রয়েছে, আপনার পক্ষে এটি আরও সহজ:

tar -cf "$HOME/$BACKUPFILE" --auto-compress .*(.)

যে .ওয়াইল্ডকার্ড অভিব্যক্তি শেষে বন্ধনীর মধ্যে একটি হল উল্লিখিত glob কোয়ালিফায়ার যে বলে "শুধুমাত্র নিয়মিত ফাইল মেলে"।

নিয়মিত ফাইলগুলিতে প্রতীকী লিঙ্কগুলি মেলে না। আপনি যদি এতে পরিবর্তন করেন .*(-.)তবে সেগুলি অন্তর্ভুক্ত করা হবে, তবে ফাইলটি সংরক্ষণাগারে শেষ না হলে এটি অন্তর্ভুক্ত করা হয় না। আপনি তাদের লক্ষ্যমাত্রা দ্বারা সিম্বলিক লিঙ্ক প্রতিস্থাপন করতে চান, তাহলে কি যে .*(-.:A):Aযোগ ইতিহাস সম্প্রসারণ পরিবর্তক যে সমাধান করা একটি পাথ যে সিম্বলিক লিংক ব্যবহার করে না এমন সব প্রতীকী লিঙ্ক।


3

এই উত্তরটি স্ল্যামের উপর ভিত্তি করে, তবে ডিরেক্টরিগুলি কীভাবে শুরু করা যায় সেগুলি আমি আপনাকে দেখাব .

আপনার হোম ডিরেক্টরিতে ডট ফাইলগুলি জিপ আপ করতে:

$ cd
$ find . -maxdepth 1 -type f -name ".?*" -exec tar czfv dotfiles.tgz {} +

ডিরেক্টরি অন্তর্ভুক্ত করতে:

$ find . -maxdepth 1 -name ".?*" -exec tar czfv dotfiles.tgz {} +

দ্য ?প্রথম কমান্ড ঐচ্ছিক, কিন্তু দ্বিতীয়, অন্যথায়, findঅন্তর্ভুক্ত করা হবে .(বর্তমান) ডিরেক্টরি।


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