tar: বর্তমান ডিরেক্টরিতে সমস্ত ফাইল এবং ডিরেক্টরি যুক্ত করুন .svn ইত্যাদি


90

আমি একটি ডিরেক্টরি tar.gz চেষ্টা করে ব্যবহার করতে চাই

tar -czf workspace.tar.gz *

ফলস্বরূপ .svnটারটিতে সাবডিয়ারগুলিতে ডিরেক্টরি অন্তর্ভুক্ত রয়েছে তবে বর্তমান ডিরেক্টরিতে নেই ( *এটি কেবল 'দৃশ্যমান' ফাইলগুলিতে প্রসারিত হওয়ার পূর্বে প্রসারিত হবে)

আমি চেষ্টা করেছি

tar -czf workspace.tar.gz .পরিবর্তে তবে আমি একটি ত্রুটি পাচ্ছি কারণ '।' পড়ার সময় পরিবর্তন হয়েছে:

tar: ./workspace.tar.gz: file changed as we read it

কোনও কৌশল আছে যাতে *কোনও ডিরেক্টরিতে সমস্ত ফাইল (ডট-প্রিফিক্সড সহ) মিলবে?

(লিনাক্স এসইএলইএস -11 এ ব্যাশ ব্যবহার করে (2.6.27.19)


4
এই প্রশ্নটি সুপারইউজারের উপর নির্ভর করে?
পিটার জারিক

উত্তর:


76

আপনি যে ডিরেক্টরিটি প্যাক করছেন তার মধ্যে টার ফাইলটি তৈরি করবেন না:

tar -czf /tmp/workspace.tar.gz .

কৌতুকটি করে, ব্যতীত এটি যখন আপনি আনপ্যাক করেন তখন সমস্ত বর্তমান ডিরেক্টরিতে ফাইলগুলি বের করে দেয়। করণীয় ভাল:

cd ..
tar -czf workspace.tar.gz workspace

অথবা, আপনি যে ডিরেক্টরিটির মধ্যে ছিলেন তার নামটি যদি না জানেন:

base=$(basename $PWD)
cd ..
tar -czf $base.tar.gz $base

(এটি ধরে নেওয়া হয় যে আপনি কোথায় আছেন সিমলিংকগুলি অনুসরণ করেন নি এবং শেলটি একটি সিমিলিংকের মাধ্যমে পিছন দিকে ঝাঁপিয়ে পড়ে দ্বিতীয় অনুমান করার চেষ্টা করে না - bashএই ক্ষেত্রে বিশ্বাসযোগ্য নয় you যদি আপনাকে এই বিষয়ে চিন্তা করতে হয় তবে, cd -P ..একটি শারীরিক পরিবর্তন ডিরেক্টরি করতে ব্যবহার করুন । মূর্খ যে আমার দৃষ্টিতে এটি ডিফল্ট আচরণ নয় - বিভ্রান্তিকর, কমপক্ষে তাদের জন্য যাদের cd ..কখনও বিকল্প অর্থ ছিল না।)


আলোচনার একটি মন্তব্য বলে:

আমার [...] শীর্ষ ডিরেক্টরিটি বাদ দিতে হবে এবং আমার [...] টার ডিরেক্টরিটি বেস ডিরেক্টরিতে রাখতে হবে।

মন্তব্যের প্রথম অংশটি তেমন কোনও অর্থবোধ করে না - যদি টার ফাইলটিতে বর্তমান ডিরেক্টরি থাকে তবে আপনি যখন সংরক্ষণাগার থেকে ফাইলটি বের করেন তখন তা তৈরি হবে না কারণ সংজ্ঞা অনুসারে, বর্তমান ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান (খুব অদ্ভুত পরিস্থিতিতে বাদে) )।

মন্তব্যের দ্বিতীয় অংশটি দুটি পদ্ধতির একটির সাথে মোকাবিলা করা যেতে পারে:

  1. হয়: ফাইল অন্য কোথাও তৈরি করুন - /tmpএটিই একটি সম্ভাব্য অবস্থান - এবং এটি সম্পূর্ণ হওয়ার পরে এটি আবার আসল অবস্থানে ফিরিয়ে আনুন।
  2. বা: আপনি যদি জিএনইউ টার ব্যবহার করছেন তবে --exclude=workspace.tar.gzবিকল্পটি ব্যবহার করুন । স্ট্রিংয়ের পরে =একটি প্যাটার্ন - উদাহরণটি সহজতম প্যাটার্ন - একটি সঠিক মিল। আপনি --exclude=./workspace.tar.gzসুপারিশের বিপরীতে বর্তমান ডিরেক্টরিতে কাজ করছেন কিনা তা আপনাকে উল্লেখ করতে হবে; আপনি --exclude=workspace/workspace.tar.gzযদি পরামর্শ মতো একটি স্তর নিয়ে কাজ করছেন তবে আপনার নির্দিষ্টকরণের প্রয়োজন হতে পারে । বাদ দেওয়ার জন্য যদি আপনার একাধিক টার ফাইল থাকে তবে ' *' হিসাবে ব্যবহার করুন --exclude=./*.gz

4
ভাল উত্তর কিন্তু আমি এমন একটি পরিস্থিতি পেয়েছি যেখানে আমাকে এই কমান্ডটি ডিরেক্টরিতে প্যাক করতে হবে তা চালাতে বাধ্য করা হয়েছে। এটিকে বাইরে চালানোর জন্য আমার কাছে অপ্রতুল অনুমতি রয়েছে।
হেক্সোডাস

প্যাক করার জন্য একটি নিখুঁত জায়গা / টিএমপি এটি নিশ্চিত sure
আন্দ্রে ফেলো

46

আপনি যদি সত্যিই তারবাল শীর্ষস্থানীয় ডিরেক্টরি অন্তর্ভুক্ত করতে না চান (এবং এটি সাধারণত খারাপ ধারণা):

tar czf workspace.tar.gz -C /path/to/workspace .

আমার উপরের ডিরেক্টরিটি বাদ দেওয়ার দরকার আছে এবং আমি বেস ডিরেক্টরিতে ডানটি রাখার প্রয়োজন।
মিশা

@ মিচা সংরক্ষণ করুন এবং ফাইলটি অনুলিপি করার জন্য একটি বাশ স্ক্রিপ্ট তৈরি করুন
ফেদির আরওয়াইথটিক

4
আপনি মনে করেন - আমি মনে করি - ইন-সিজেএফ।
আপক্রিক

10
man tar: তারের প্রথম যুক্তিটি একটি ফাংশন হওয়া উচিত; বর্ণগুলির একটি Acdrtux, বা দীর্ঘ ফাংশনগুলির একটি। একটি ফাংশন চিঠির উপসর্গ করা প্রয়োজন হবে না- , এবং অন্যান্য একক-বর্ণের বিকল্পগুলির সাথে মিলিত হতে পারে।
rkhayrov

4
এখনও কাজ করে না, আমার কাছে এখনও "" রয়েছে। আমার টার্বল শীর্ষস্থানীয় ডিরেক্টরি হিসাবে
এ। গিল

43

কয়েকটি পদক্ষেপ নিতে হবে:

  1. লুকানো ফাইলগুলিও অন্তর্ভুক্ত *করে প্রতিস্থাপন করুন .
  2. একই ডিরেক্টরিতে সংরক্ষণাগার তৈরি --exclude=workspace.tar.gzকরতে আর্কাইভটি নিজেই বাদ দিতে একটি ব্যবহার করা যেতে পারে।
  3. প্রতিরোধ করার জন্য tar: .: file changed as we read itত্রুটি সংরক্ষণাগার এখনও তৈরি হয়নি, নিশ্চিত করুন এটি বিদ্যমান (যেমন ব্যবহার করা touch), তাই --exclude সংরক্ষণাগার ফাইলের নাম ম্যাচ। (এটির সাথে এটি মিলছে না ফাইলটি বিদ্যমান নেই)

নিম্নলিখিত স্ক্রিপ্টে এই ফলাফলগুলি সংযুক্ত করে:

touch workspace.tar.gz
tar -czf workspace.tar.gz --exclude=workspace.tar.gz .

7
আমি সমস্ত উত্তর এবং মন্তব্য পড়েছি এবং এটি একই দির মধ্যে টারবাল তৈরির সর্বোত্তম উপায়। এই উত্তরটি থেকে আমি বুঝতে পেরেছিলাম কেন এই ত্রুটিটি ঘটে।
সিজমন সাদো

আপনি যখন এটি আপনার আলকাতরা ফাইল সংকুচিতকারী অগ্রগতি দেখতে চান, আপনার জন্য একটি অতিরিক্ত পতাকা যোগ করতে পারেন --verbose, যেমন: -czvf
মাস্ত্রেয়নি

18

ডিরেক্টরিতে সংকোচন করতে চান (বর্তমান ডিরেক্টরি) এটি চেষ্টা করুন:

tar -czf workspace.tar.gz . --exclude=./*.gz

4
তবে এখন এটি অভিযোগ করে যে ফাইল "" " পড়ার সময় পরিবর্তিত হয়েছে। আমি কী নিশ্চিত যে সমস্ত ফাইল অন্তর্ভুক্ত করা হয়েছে?
জান

4
এটি সব বাদ দেয় .gz ডিরেক্টরিতে ফাইল ।
omefarukdogan

12

আপনি কোনও ডিরেক্টরি ফিরে গিয়ে এবং লুকিয়ে থাকা ডিরেক্টরিগুলি অন্তর্ভুক্ত করতে পারেন:

cd ..
tar czf workspace.tar.gz workspace

আপনি যে ডিরেক্টরিটি জিজিপ করতে চেয়েছিলেন তা ধরে নিয়েই ওয়ার্কস্পেস বলে।


এবং এটি ফাইলের পরিবর্তনকেও এড়ানো যায়।
জোনাথন লেফলার

যখন প্যারেন্ট ফোল্ডারে ব্যবহারকারীর লেখার অনুমতি নেই তখন কাজ করে না।
জোছিম ওয়াগনার

নিখুঁতভাবে @ জোছিম ওয়াগনার!
p01ymath

4
@ জোছিম ওয়াগনার আপনার যদি লেখার অনুমতি না থাকে তবে এটিতে এটি পরিবর্তন করুন:tar -czf /path/to/where/you/do/have/permission/workspace.tar.gz workspace
ব্র্যাম্প

4
এটি কাজ করার জন্য আমাকে -আগে বের করে নিতে হয়েছিল czf। অন্যথায় আমি Cannot stat: No such file or directoryত্রুটি বার্তা পেয়েছিলাম ।
ফেমেলো খেঠো

6

আপনি .ব্যবহার করে ফর্মটি ঠিক করতে পারেন --exclude:

tar -czf workspace.tar.gz --exclude=workspace.tar.gz .

5

আপডেট: আমি ওপির মন্তব্যের জন্য একটি সংশোধন করেছি।

tar -czf workspace.tar.gz .

প্রকৃতপক্ষে বর্তমান ডিরেক্টরিটি পরিবর্তন করবে তবে ফাইলটি অন্য কোথাও রাখবেন না কেন?

tar -czf somewhereelse/workspace.tar.gz .
mv somewhereelse/workspace.tar.gz . # Update

এরপরে ফাইলটি প্রক্রিয়া করা হবে এবং এটি ওয়ার্কস্পেসে থাকা দরকার - এটি একটি সামান্য বিড কদর্য তবে এটি কেবল প্রয়োজন (পুরো জিনিসটি কেবল একটি কর্মচক্র ...)
মীখা

ঠিক আছে, আমি এর জন্য একটি সংশোধন করব :)
পিটার জারিক

এবং যদি আপনার এটি বারবার চালাতে সক্ষম হতে হয় তবে তার লাইনের আগে 'আরএম ওয়ার্কস্পেস.টর.জেড' যুক্ত করুন।
পিটার জারিক

আপনি একটি সম্পূর্ণ ড্রাইভ আলকাতরা চান তবে মধ্যে যে একই ড্রাইভ, মনে হয় আপনি অনেক অপশন নেই।
BeeOnRope

4

আসলে সমস্যাটি সংকোচন বিকল্পগুলির সাথে। কৌতুকটি হ'ল বিল্ট-ইন বিকল্পগুলি ব্যবহার করার পরিবর্তে একটি সংকোচকের কাছে টর ফলাফল। ঘটনাচক্রে এটি আপনাকে আরও ভাল সংক্ষেপণ দিতে পারে, যেহেতু আপনি অতিরিক্ত সংকলনের বিকল্পগুলি সেট করতে পারেন।

সর্বনিম্ন টার:

tar --exclude=*.tar* -cf workspace.tar .

আপনার পছন্দের সংকোচকের কাছে পাইপ। এই উদাহরণটি ভার্বোজ এবং সর্বাধিক সংকোচনের সাথে xz ব্যবহার করে:

tar --exclude=*.tar* -cv . | xz -9v >workspace.tar.xz

উইন্ডোজ on-এ উবুন্টু ১৪.০৪ এবং সাইগউইনে সমাধানটি পরীক্ষা করা হয়েছিল It's


ধন্যবাদ! মা জীবন রক্ষা করেছেন
স্টিভেন

2

এখানে প্রদত্ত সর্বাধিক সমাধানগুলির সাথে সমস্যাটি হ'ল ./প্রতিটা প্রবেশের ভিক্ষাবৃত্তিতে টার থাকে । সুতরাং .GUI সংকোচকারী মাধ্যমে এটি খোলার সময় ডিরেক্টরি থাকার ফলস্বরূপ । সুতরাং আমি যা করে শেষ করেছি তা হ'ল:

ls -1A | xargs -d "\n" tar cfz my.tar.gz

আপনার যদি ইতিমধ্যে my.tar.gzবর্তমান ডিরেক্টরিতে থাকে তবে আপনি এটি গ্রেপ করতে চাইতে পারেন:

ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz

জার্গেজ সম্পর্কে সচেতন থাকুন নির্দিষ্ট সীমা রয়েছে (দেখুন xargs --show-limits)। সুতরাং আপনি যদি কোনও ডিরেক্টরি অনুসন্ধান করার চেষ্টা করছেন এমন একটি প্যাকেজ তৈরি করার চেষ্টা করছেন যা প্রচুর এন্ট্রি (ডিরেক্টরি এবং ফাইল) তৈরি করার চেষ্টা করছেন তবে এই সমাধানটি কার্যকর হবে না।


1

একটি ভাল প্রশ্ন। জেডএসএইচে আপনি গ্লোব্বিং মডিফায়ার ব্যবহার করতে পারেন (D)যা " ডটফাইলস " হিসাবে দাঁড়িয়েছে। তুলনা করা:

ls $HOME/*

এবং

ls $HOME/*(D)

এটি সঠিকভাবে বিশেষ ডিরেক্টরি এন্ট্রি .এবং বাদ দেয় ..। বাশে আপনি .*ডটফিলগুলি স্পষ্টভাবে অন্তর্ভুক্ত করতে ব্যবহার করতে পারেন :

ls $HOME/* $HOME/.*

তবে এর মধ্যে রয়েছে .এবং ..পাশাপাশি, তাই আপনি যা খুঁজছিলেন তা তা নয়। আমি নিশ্চিত যে *ব্যাশে ম্যাচ ডটফিলগুলি তৈরি করার কিছু উপায় আছে ।


ব্যাশে, .??*সমস্ত ডট ফাইলের সাথে মেলে না .এবং ব্যবহার করুন ..। এটি একক অক্ষর ডট ফাইলগুলি (যেমন .a) পায় না। সেগুলি পেতে, আরও জটিল ব্যবহার করুন .[^.]*
স্কট মিনস্টার

1

তবুও আরেকটি সমাধান, ধরে নিলে ফোল্ডারে আইটেমের সংখ্যা বিশাল নয়:

tar -czf workspace.tar.gz `ls -A`

( ls -Aসাধারণ এবং লুকানো ফাইল মুদ্রণ করে তবে "।" এবং ".." নয় ls -a))


0
tar -czf workspace.tar.gz .??* *

নির্দিষ্টকরণে .??*"ডট" ফাইল এবং ডিরেক্টরিগুলি অন্তর্ভুক্ত করবে যে বিন্দুর পরে কমপক্ষে 2 টি অক্ষর থাকবে। নীচের দিকটি হ'ল এটি বিন্দুর পরে কোনও একক অক্ষরের সাথে ফাইল / ডিরেক্টরি অন্তর্ভুক্ত করবে না, যেমন .aযদি কোনও থাকে।


0

যদি ডিস্ক স্পেস স্পেস কোনও সমস্যা না হয় তবে এটি করা খুব সহজ জিনিস হতে পারে:

mkdir backup
cp -r ./* backup
tar -zcvf backup.tar.gz ./backup

0

আমারও একই অবস্থা ছিল। আমি মনে করি যে অন্য কোথাও টার তৈরি করা ভাল এবং তারপরে সংক্ষেপিত ফাইলগুলির জন্য টার ডিরেক্টরিটি বলার জন্য -C ব্যবহার করুন। উদাহরণ:

tar -cjf workspace.tar.gz -C <path_to_workspace> $(ls -A <path_to_workspace>)

এইভাবে আপনার নিজের ট্যারিফাইল বাদ দেওয়ার দরকার নেই। অন্যান্য মন্তব্যে উল্লিখিত হিসাবে, -এ লুকানো ফাইলগুলি তালিকাবদ্ধ করবে।


0

10 বছর পরে, আপনার কাছে বিকল্প রয়েছে tar, গিট 2.30 (কিউ 12021) দিয়ে চিত্রিত, যা " git archive" ( ম্যান ) ব্যবহার করে টার পরিবর্তে রিলিজ তারবাল তৈরি করে ।
(বিকল্পটি প্রয়োগ করার জন্য আপনার 2.6 গিটের দরকার নেই)

দেখুন কমিট 4813277 (11 অক্টোবর 2020), এবং কমিট 93e7031 (10 অক্টোবর 2020) দ্বারা রেনে Scharfe ( rscharfe)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 63e5273 , 27 অক্টোবর 2020)

Makefile: ডিট-ডক এর জন্য গিট আরডি / অ্যাড / কমিট / আর্কাইভ ব্যবহার করুন

সাইন-অফ-বাই: রেনা স্কার্ফি

এইচটিএমএল ডকুমেন্টেশনের জন্য বিতরণের সংরক্ষণাগারগুলি তৈরি করে এবং তার পরিবর্তে ( ম্যান ) কমান্ড ব্যবহার করে ম্যানপেজগুলি বাইরের সরঞ্জামগুলির উপর নির্ভরতা হ্রাস করুন । এটি সংরক্ষণাগার এন্ট্রিগুলিকে বাইনারিগুলির জন্য পৃথক সংরক্ষণাগারগুলির মতো একই মেটা ডেটা দেয়।git

এর পরিবর্তে:

tar cf ../archive.tar .

আপনি কেবল গিট ব্যবহার করে করতে পারেন:

git -C workspace init
git -C workspace add .
git -C workspace commit -m workspace
git -C workspace archive --format=tar --prefix=./ HEAD^{tree} > workspace.tar
rm -Rf workspace/.git

এটি প্রাথমিকভাবে প্রস্তাবিত হয়েছিল কারণ এখানে যেমন ব্যাখ্যা করা হয়েছে , কিছু বিদেশী প্ল্যাটফর্মের অপ্রতুলতার বিকল্পগুলির সাথে একটি পুরানো টার বিতরণ থাকতে পারে।


-1

ব্যবহার findকরা সম্ভবত সবচেয়ে সহজ উপায়:

find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+

find . -maxdepth 1বর্তমান ডিরেক্টরিতে সমস্ত ফাইল / ডিরেক্টরি / সিমলিঙ্কস / ইত্যাদি খুঁজে পাবেন এবং সুনির্দিষ্ট কমান্ডটি চালাবেন -exec{}কমান্ড মানে ফাইল তালিকা এখানে যায় এবং \+অর্থ যে কমান্ড হিসাবে চালানো হবে:

tar zcvf workspace.tar.gz .file1 .file2 .dir3

পরিবর্তে

tar zcvf workspace.tar.gz .file1
tar zcvf workspace.tar.gz .file2
tar zcvf workspace.tar.gz .dir3

-জে ম্যানুয়ালটিতে --xz; -c সঙ্গে মিলিত শুধু একটি কম্পিউটার "মজা" :) ডাকব কি শুরু
Ricalsin

হাহাহা, বাড়িতে আমার মিনি-সার্ভারটি সিপিইউয়ের চেয়ে ডিস্ক স্পেস দ্বারা আরও সীমাবদ্ধ :) যদিও ভাল পয়েন্ট; আমি জিজিপ ব্যবহারের জন্য এটি পরিবর্তন করব।
অ্যান্ড্রু গোনারসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.