ম্যাথিয়াস যেমন বলেছিলেন, 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
উপস্থিত না থাকলে এটি স্বয়ংক্রিয়ভাবে আপনার জন্য তৈরি হয়ে যাবে )