টার্বম্ব্বের ক্ষেত্রে বর্তমান ডিরেক্টরিটি কলুষিত না করে নিরাপদে কীভাবে আনতে হবে?


33

শ্রদ্ধেয় প্রকল্প, আলকাতরা আর্কাইভ একটি একক ডিরেক্টরি ধারণ মুক্তি উদাহরণস্বরূপ zyrgus-3.18.tar.gzএকটি রয়েছে zyrgus-3.18ফোল্ডারের যা আবার রয়েছে src, build, dist, ইত্যাদি

তবে কিছু পাঙ্ক প্রকল্পগুলি সবকিছুকে মূলের মূলে ফেলে দেয়: '- ( আনর্কাইভিংয়ের সময় এটি পুরো গোলমেলে পরিণত হয় every প্রতিবার ম্যানুয়ালি ফোল্ডার তৈরি করা একটি ব্যথা এবং বেশিরভাগ সময় অপ্রয়োজনীয়।

  • .Tar বা .tar.gz ফাইলের মূলটিতে একক ডিরেক্টরিের চেয়ে বেশি রয়েছে কি না তা বলার একটি অতি দ্রুত উপায় আছে? এমনকি একটি বড় সংরক্ষণাগার জন্য।
  • বা আরও ভাল, এমন কোনও সরঞ্জাম রয়েছে যা এই ক্ষেত্রে একটি ডিরেক্টরি তৈরি করে (প্রসার ছাড়াই সংরক্ষণাগার নাম) এবং সমস্ত কিছু ভিতরে রেখে দেয়?


2
আমি মনে করি প্যাকেজ লেখকের কাছে বাগ রিপোর্টের মূল্য ভাঙা প্যাকেজিং।

14
আমি icallyতিহাসিকভাবে (90 এর দশকের মাঝামাঝি থেকে) কেবল সর্বদা একটি উপ-ডিরেক্টরিতে অবতীর্ণ হয়নি। যদি এগুলি সমস্ত একক ডিরেক্টরিতে রাখা হয় (যেমন এটি হওয়া উচিত) তবে এর বিষয়বস্তুগুলি এমভি দিয়ে সঠিক জায়গায় সরিয়ে নেওয়া যেতে পারে, তবে আপনি অতিরিক্ত অতিরিক্ত ডিরেক্টরি মুছতে পারেন। দুটি অতিরিক্ত পদক্ষেপ হ্যাঁ, তবে এটি ভুলভাবে তৈরি টার ফাইল থেকে বিশৃঙ্খলা পরিষ্কার করে।
টেড

6
But some punk projects put everything at the root :'-(এবং কিছু পঙ্ক প্রকল্পগুলি সম্পূর্ণরূপে একটি ফোল্ডারের ভিতরে অযৌক্তিকভাবে সমস্ত কিছু রাখে, বিবেচনা করে যে তারা ইতিমধ্যে একটি বদ্ধ আর্কাইভের ভিতরে সমস্ত কিছু রাখছে, যাতে আপনি যখন কোনও স্মার্ট ব্যবহারকারীর মতো এটি নিজের ফোল্ডারে ডাউনলোড এবং আনজিপ করেন তখন আপনি সমস্ত কিছু শেষ করবেন সামগ্রী অন্য স্তর নিচে সমাহিত। ;-)
ম্যাসন হুইলারের

2
@ ম্যাসনহিলার টর ​​সংরক্ষণাগারগুলির ভিতরে একটি ফোল্ডারে সমস্ত কিছু রাখার জন্য এক ধরণের "ডি-ফ্যাক্টো স্ট্যান্ডার্ড" রয়েছে।
glglgl

উত্তর:


30

প্যাটুল বিভিন্ন ধরণের সংরক্ষণাগার পরিচালনা করে এবং আর্কাইভে নিষ্ক্রিয় ফাইলগুলির সাথে ওয়ার্কিং ডিরেক্টরিকে বিশৃঙ্খলা রোধ করার জন্য একাধিক ফাইল রয়েছে সেক্ষেত্রে একটি সাব-ডাইরেক্টরি তৈরি করে।

সংরক্ষণাগারটি বের করুন

patool extract archive.tar

সমর্থিত বিন্যাসগুলির একটি তালিকা পেতে, ব্যবহার করুন patool formats


এফওয়াইআই: এটি সোর্সফোর্জন.নেট / প্রজেক্টস / পাটুলে পাওয়া গেছে । এটি একটি আরপিএম এবং আমি alienএটি উবুন্টুর জন্য একটি ডেবে রূপান্তরিত করতাম।
জো

patoolআপনি যদি কোনও বর্তমান সংস্করণ চালাচ্ছেন তবে ডেবিয়ান এবং উবুন্টুর জন্য রেপোতে থাকা উচিত।
মার্কো

12

আপনি যেমন কিছু করতে পারে

tar tf thefile.tar | cut -d/ -f1 | sort -u

একটি টারের শীর্ষ স্তরের কী কী প্রবেশ রয়েছে তা দেখতে; পাইপ wc -lএকাধিক আছে কিনা তা পরীক্ষা করতে। মনে রাখবেন যে কয়েকটি ব্যর্থ হয়েছে যেখানে এটি ব্যর্থ হবে, উদাহরণস্বরূপ যদি টর্মে ফর্মের ফাইলগুলি somedir/whateverএবং এছাড়াও ./somedir/whatever(বা কিছু ক্রেজিয়ার) থাকে; যদিও এটি অস্বাভাবিক হওয়া উচিত।

এটি আউটপুট দেওয়ার আগে পুরো টার ফাইলটি পড়বে, কারণ sortএটি আসলে উত্তোলনের চেয়ে দ্রুত হওয়া উচিত কারণ এটি কেবল একটি অনুক্রমিক পঠন এবং এটি বড় ফাইলগুলি এড়িয়ে যেতে পারে।

আপনি এই ইন্টারেক্টিভ করছেন এবং ফাইল বৃহৎ হতে পারে, তাহলে আপনি পরিবর্তন করতে পারেন sort -uকরতে uniqএবং Control+ + Cচেয়ে বেশি এক জিনিস যদি এটা আউট ছাপে।


2
sort | uniqসংক্ষিপ্ত করা যেতে পারে sort -u
মার্কো

4
যদি না আপনি কি করতে চানuniq -c
সি এ এস

7

আপনি করতে পারেন:

pax <some.tar

... একটি tarফাইলের বিষয়বস্তু তালিকাবদ্ধ করতে।

আপনি যদি জানতে চান যে এটি কত স্তরের গভীরে চলে যায়, আপনি এটি করতে পারেন:

pax <some.tar | tr -dc /\\n | sort -r | head -n1

আপনি নিষ্কাশন উপর বিস্ফোরণ স্পষ্টভাবে নিষেধ করতে পারেন সাথে:

mkdir some.tar
pax -'rs|^|some.tar/|' <some.tar

2

এটি আপনার যা করা উচিত তা করা উচিত। আমি নিশ্চিত কেউ এটির উন্নতি করতে পারে। এই উদাহরণগুলিতে আমি একটি gzip সংকুচিত টার আর্কাইভ ধরেছি কারণ এটি সবচেয়ে সাধারণ।

আপনি একটি সংরক্ষণাগার চান যেখানে মূল স্তরের ডিরেক্টরি ট্রিতে কোনও ভাইবোন নোড নেই।

টার সামগ্রী তালিকার প্রতিটি প্রবেশের একই প্যাটার্ন দিয়ে শুরু করা উচিত। এই প্যাটার্নটি বেস ডিরেক্টরি পাথ যা আর্কাইভের সমস্ত এন্ট্রি ভাগ করতে হবে। যদি কোনও দুটি এন্ট্রি একই প্যাটার্ন দিয়ে শুরু না হয় তবে তারা ভাইবোন।

টার সামগ্রী তালিকার প্রথম লাইন আপনাকে যাচাই করতে হবে এমন ন্যূনতম প্যাটার্ন দেবে। এটি বাসপথ।

BASEPATH=$(tar ztf example.tar.gz | (read line; echo $line))

তারপরে বিস্ফোরক টার্বলগুলি পরীক্ষা করার জন্য আপনাকে বারেরপথ দিয়ে টার সামগ্রী তালিকার কোনও লাইন শুরু হচ্ছে না কিনা তা পরীক্ষা করে দেখতে হবে।

tar ztf example.tar.gz | grep -qv "^${BASEPATH}"

এটিকে শেল ফাংশনে পরিণত করুন:

is_explosive() {
    TARBALL_NAME=$1
    tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))"
    return $?
}

এখান থেকে আপনি একটি নিরাপদ টাকার সংরক্ষণাগার নিষ্কাশন ফাংশন লিখতে পারেন।

is_explosive() {
    TARBALL_NAME=$1
    tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))"
    return $?
}

safe_tar_x() {
    TARBALL_NAME=$1
    if is_explosive ${TARBALL_NAME}; then
        SUBDIR=${TARBALL_NAME%.tar.gz}
        SUBDIR=${SUBDIR##*/}
        mkdir "${SUBDIR}"
        echo "WARNING: This tarball is explosive. Opening in subdirectory, ${SUBDIR}, for safety." >&2
    else
        SUBDIR="."
    fi
    # Tar quirks: "--directory" must be last, and using more than
    #     one option group requires that all groups start with a dash.
    tar -zxf "${TARBALL_NAME}" --directory "${SUBDIR}"
    return $?
}

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