এটি জোনির উত্তরে কী চলছে তা চিহ্নিত করার পাশাপাশি এটি লিনাক্সে কেন কাজ করে তবে ম্যাকের নয় কেন এই প্রশ্নের উত্তর দেয়।
সমস্যাটি ম্যাক ওএস এক্স ব্যবহার করে bsdtar
, যেখানে বেশিরভাগ লিনাক্স সিস্টেম ব্যবহার করে gnutar
।
আপনি ইনস্টল করতে পারেন gnutar
উপর Homebrew সঙ্গে একটি ম্যাক ব্যবহার brew install gnu-tar
, যা সিমবলিক লিঙ্ক হবে gnutar
মধ্যে /usr/local/bin
যেমন gtar
।
আপনি যদি ইনস্টল করেন gnutar
, তবে আপনি জনির উত্তরের পদক্ষেপগুলি ব্যবহার করে সমস্যাটি পুনরুত্পাদন করতে পারেন ।
$ brew install gnu-tar
==> Downloading https://homebrew.bintray.com/bottles/gnu-tar-1.28.yosemite.bottle.2.tar.gz
######################################################################## 100.0%
==> Pouring gnu-tar-1.28.yosemite.bottle.2.tar.gz
==> Caveats
gnu-tar has been installed as "gtar".
If you really need to use it as "tar", you can add a "gnubin" directory
to your PATH from your bashrc like:
PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
==> Summary
🍺 /usr/local/Cellar/gnu-tar/1.28: 13 files, 1.6M
$ mkdir test
$ touch test/a test/b
$ gtar -zcvf test.tar.gz test test/a # make the archive with gnutar
test/
test/a
test/b
test/a
$ gtar -ztvf test.tar.gz
drwxr-xr-x adamliter/staff 0 2015-07-28 22:41 test/
-rw-r--r-- adamliter/staff 0 2015-07-28 22:41 test/a
-rw-r--r-- adamliter/staff 0 2015-07-28 22:41 test/b
hrw-r--r-- adamliter/staff 0 2015-07-28 22:41 test/a link to test/a
$ rm -r test
$ tar -xvf test.tar.gz # try to unpack the archive with bsdtar
x test/
x test/a
x test/b
x test/a: Can't create 'test/a'
tar: Error exit delayed from previous errors.
$ echo $?
1
সুতরাং স্পষ্টতই gnutar
জিনিসগুলি এমনভাবে পৃথকভাবে সংরক্ষণাগারভুক্ত করা হয় যার ফলে bsdtar
সদৃশগুলিতে দম বন্ধ হয়ে যায়। gtar -ztvf test.tar.gz
দ্বিতীয় যে উদাহরণটি test/a
আর্কাইভ করা হয়েছে link to test/a
তা প্রাসঙ্গিক বলে প্রমাণিত করে । জনি যেমন মন্তব্যগুলিতে উল্লেখ করেছেন, gnutar
আসল ফাইলের চেয়ে ডুপ্লিকেটগুলিকে হার্ড লিঙ্ক হিসাবে সংরক্ষণ করবে, যা অক্ষম করা যেতে পারে--hard-dereference
।
এটি হল, আপনি নিম্নলিখিতগুলি করতে পারেন:
$ mkdir test
$ touch test/a test/b
$ gtar -zcvf test.tar.gz test test/a --hard-dereference
test/
test/a
test/b
test/a
$ gtar -ztvf test.tar.gz test
drwxr-xr-x adamliter/staff 0 2015-07-28 23:49 test/
-rw-r--r-- adamliter/staff 0 2015-07-28 23:49 test/a
-rw-r--r-- adamliter/staff 0 2015-07-28 23:49 test/b
-rw-r--r-- adamliter/staff 0 2015-07-28 23:49 test/a # note that this is no longer a link
$ rm -r test
$ tar -xvf test.tar.gz # unpack with bsdtar
x test/
x test/a
x test/b
x test/a
$ echo $?
0
$ ls test/
a b
যাইহোক, এই ক্ষেত্রে, আপনি স্পষ্টতই টারবল তৈরি নিয়ন্ত্রণ করেন না, সুতরাং --hard-dereference
এটি কোনও বিকল্প নয়। ভাগ্যক্রমে, ওপি এর উত্তরের উপর ভিত্তি করে , মনে হচ্ছে এই সমস্যাটি প্রবাহ দ্বারা স্থির করা হয়েছে।
তবুও, ভবিষ্যতে অন্য কেউ যদি এই সমস্যায় পড়ে এবং দ্রুত সমাধানের প্রয়োজন হয় বা কোনও প্রতিক্রিয়াহীন আপস্ট্রিম রক্ষণাবেক্ষণকারী রয়েছে, তবে কাজ করার উপায় নেই।
ডুপ্লিকেট ফাইলটি কী তা শনাক্ত করার পরে আপনি --fast-read
বিকল্পটি ব্যবহার করতে পারেন bsdtar
(নোট করুন যে এই বিকল্পটি কেবলমাত্র এর অংশ bsdtar
, নয় gnutar
):
-q (--fast-read)
(x and t mode only) Extract or list only the first archive entry that matches each pattern or filename operand. Exit as soon as each specified pat-
tern or filename has been matched. By default, the archive is always read to the very end, since there can be multiple entries with the same name
and, by convention, later entries overwrite earlier entries. This option is provided as a performance optimization.
সুতরাং, আমি খেলনা উদাহরণে যে জনি এর উত্তরে খেলনা উদাহরণ অনুসরণ করে তৈরি করেছি , সদৃশ ফাইল test/a
। সুতরাং, আপনি নিম্নলিখিতটি করে এই সমস্যাটি এড়াতে পারেন:
# this set of commands picks up from the first set of commands
# i.e., the following assumes a tarball that was *not* made with
# the --hard-dereference option, although this will work just as well
# with one that was
$ tar -xvqf test.tar.gz test/a # unarchive the first instance of test/a
x test/a
$ tar -xvf test.tar.gz --exclude test/a # unarchive everything except test/a
x test/
x test/b
$ echo $?
0
$ ls test/
a b
দ্রষ্টব্য, তদ্ব্যতীত, অপশনটি ব্যবহার না করা gnutar
সত্ত্বেও, নিজেই তৈরি করা নকলগুলি সহ একটি সংরক্ষণাগার আনপ্যাক করে পুরোপুরি খুশি --hard-dereference
:
$ rm -r test
$ gtar -xvf test.tar.gz
test/
test/a
test/b
test/a
$ echo $?
0
$ ls test/
a b
সুতরাং এটি ম্যাকের উপর কেন ত্রুটি নিক্ষেপ করা হচ্ছে তবে লিনাক্স নয় এই প্রশ্নটির উত্তর দেয়। (বেশিরভাগ) লিনাক্স জাহাজটি ডিস্ট্রোস করে gnutar
এবং যেহেতু টার্বলটি সম্ভবত প্যাকেজযুক্ত ছিল gnutar
তাই আনপ্যাক করার সময় কোনও ত্রুটি হবে না gnutar
, তবে আনপ্যাক করার সময় একটি ত্রুটি হবে bsdtar
।
আরও পড়ার জন্য এবং রেফারেন্সের জন্য, আপনি দেখতে চাইতে পারেন বিএসডিটার এবং জিএনইউ টারের মধ্যে পার্থক্য কী? ইউনিক্স.এসই তে