আনজিপ-এ টারের "--strip-घटक = 1" এর সমান?


48

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা একটি নির্দিষ্ট সাব-ডাইরেক্টরি মাইসফোল্ডারটিতে একটি tar.gz -file আহরণ করে :

mkdir mysubfolder; tar --extract --file=sourcefile.tar.gz --strip-components=1 --directory=mysubfolder;

জিপ-ফাইল দিয়ে এটি করার কোনও সমতুল উপায় আছে কি?


2
কেবল বিএসডিটার ব্যবহার করুন
শুক্রবার

উত্তর:


26

ম্যাথিয়াস যেমন বলেছিলেন, unzipতেমন কোনও বিকল্প নেই তবে ওয়ান-লাইনার ব্যাশ স্ক্রিপ্টটি কাজটি করতে পারে।

সমস্যাটি হ'ল: সর্বোত্তম পন্থা আপনার সংরক্ষণাগার বিন্যাসের উপর নির্ভর করে। একটি সমাধান যে অনুমান একটি একক টপ লেভেল Dir সেই বিফল মনোরথ হয়েছে যদি বিষয়বস্তু সংরক্ষণাগার রুট সরাসরি আছে (আমার মনে হয় /a/foo /b/foo /fooএবং stripping বিশৃঙ্খলার /aএবং /b)।

এবং একই ব্যর্থতা সঙ্গে ঘটে tar --strip-component। কোনও আকারের-ফিট-সব সমাধান নেই।

সুতরাং, মূল Dir স্ট্রিপ অভিমানী সেখানে হয় এক (এবং শুধুমাত্র এক):

unzip -d "$dest" "$zip" && f=("$dest"/*) && mv "$dest"/*/* "$dest" && rmdir "${f[@]}"

শুধু নিশ্চিত দ্বিতীয় স্তরের ফাইল / dirs না করতে না (যেমন, টপ লেভেল পিতা বা মাতা এর নাম একই /foo/foo)। তবে /foo/bar/fooএবং /foo/bar/barঠিক আছে। যদি তারা তা করে, বা আপনি কেবল নিরাপদ থাকতে চান তবে আপনি উত্তোলনের জন্য একটি টেম্পার ডির ব্যবহার করতে পারেন:

temp=$(mktemp -d) && unzip -d "$temp" "$zip" && mkdir -p "$dest" &&
mv "$temp"/*/* "$dest" && rmdir "$temp"/* "$temp"

আপনি যদি ব্যাশ ব্যবহার করছেন তবে আপনি শীর্ষ স্তরটি একক দির কিনা তা পরীক্ষা করতে পারেন:

f=("$temp"/*); (( ${#f[@]} == 1 )) && [[ -d "${f[0]}" ]] && echo "Single dir!"

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

unzip-strip() (
    local zip=$1
    local dest=${2:-.}
    local temp=$(mktemp -d) && unzip -d "$temp" "$zip" && mkdir -p "$dest" &&
    shopt -s dotglob && local f=("$temp"/*) &&
    if (( ${#f[@]} == 1 )) && [[ -d "${f[0]}" ]] ; then
        mv "$temp"/*/* "$dest"
    else
        mv "$temp"/* "$dest"
    fi && rmdir "$temp"/* "$temp"
)

এখন করা আপনার যে ~/.bashrcবা ~/.profileএবং আপনি এটি সম্পর্কে চিন্তা করতে আবার দরকারও হয় না। কেবল হিসাবে ব্যবহার করুন:

unzip-strip sourcefile.zip mysubfolder

(লক্ষ্য করুন এটি mysubfolderউপস্থিত না থাকলে এটি স্বয়ংক্রিয়ভাবে আপনার জন্য তৈরি হয়ে যাবে )


আমি যেমনটি প্রত্যাশা করছিলাম তেমনি এটি কোনও বিদ্যমান ডিরেক্টরি কাঠামোয় আনজিপ করবে না (আমি চেষ্টা করার চেষ্টা করেছি। মাইসফোল্ডারটির জায়গায়)। আমি কেবল আনজিপিং (আনজিপ জিপ-উইথ-টোপ -ডির.জিপ) শেষ করে শেষ করেছিলাম (সিপি-আরভি এক্সট্রাক্টড-টপ-জিপ-ডির / *।))
catgofire

4

আমি ম্যানুয়াল পৃষ্ঠাগুলিতে এই জাতীয়unzip বিকল্পটি খুঁজে পাইনি, তাই আমি আশঙ্কা করি এটি অসম্ভব is :(

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

cd /tmp
unzip /path/to/file.zip
cd foo-*
cp -r . /path/to/destination/folder

চমৎকার পদ্ধতির, তবে কিছুটা অসম্পূর্ণ: আপনার এখনও নিষ্কাশিত সামগ্রীর সাথে ফু * দির থাকবে।
MestreLion

হ্যাঁ, আমি rm -rf foo-*উদ্দেশ্য হিসাবে যুক্ত করিনি কারণ এটি সম্ভাব্য বিপজ্জনক। ইতিমধ্যে যদি সেখানে একটি ফোল্ডার নাম দেওয়া হয় foo-bar? দ্রষ্টব্য যে /tmpফোল্ডারটির মধ্যে নিষ্কাশনটি করা হচ্ছে , যা এখন এবং পরে স্বয়ংক্রিয়ভাবে খালি হয়ে যায়।
ম্যাথিয়াস বাইনেস

এই কারণেই আমি অপারেশনগুলিকে ব্যবহার করে শৃঙ্খলাবদ্ধ &&: পূর্ববর্তী পদক্ষেপটি সফল হলে একটি প্রদত্ত পদক্ষেপ কেবল তখনই ঘটে, সুতরাং শেষ পদক্ষেপটি rmকেবলমাত্র তখনই চালিত হয় যদি সমস্ত পদক্ষেপ কোনও ত্রুটি ছাড়াই সম্পন্ন হয়।
MestreLion

2
এজন্যই কোনও ব্যক্তিকে কখনই /tmp/some-hardcoded-folder-nameটেম্প ফোল্ডার হিসাবে ব্যবহার করা উচিত নয়, পরিবর্তে এর mktempজন্য ব্যবহার করা উচিত : এটি গ্যারান্টি দেয় যে এরূপ বিদ্যমান ফোল্ডারটি আর থাকবে না। আমার উত্তর নীচে পরীক্ষা করুন।
MestreLion

1

আপনি -jজাঙ্ক পাথ ব্যবহার করতে পারেন (ডিরেক্টরিগুলি তৈরি করবেন না)। এটি কেবলমাত্র কিছু সাধারণ একক-স্তরের সংরক্ষণাগারগুলির জন্য প্রস্তাবিত। মাল্টি লেভেল ডিরেক্টরি স্ট্রাকচার সহ সংরক্ষণাগারগুলি সমতল করা হবে - এটি ফাইলগুলি বের করার জন্য নাম সংঘর্ষের কারণ হতে পারে।

আনজিপের ম্যান পৃষ্ঠা থেকে:

   -j     junk  paths.   The  archive's directory structure is not recreated; all files are deposited in the
          extraction directory (by default, the current one).
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.