একই বেস নাম সহ ডিরেক্টরিতে ট্যুর এক্সট্রাক্ট?


18

আমার মতো একটি জিপযুক্ত ফাইল রয়েছে myArchive123.tar.gz। এটির ভিতরে একটি ফোল্ডার রয়েছেhelloWorld

যদি আমি এটিটি বের করি: tar -xf myArchive123.tar.gzআমি helloWorldফোল্ডারটি পেয়েছি :

ls 
myArchive123.tar.gz
helloWorld 

আমি আউটপুটটি ফাইলের নাম বিয়োগের .tar.gz এক্সটেনশানের একই নাম হিসাবে দেখতে চাই। অর্থাৎ,

tar <magic paramaters> myArchive123.tar.gz 
ls 
 myArchive123.tar.gz
 myArchive123
cd myArchive123
ls 
  helloWorld

এই কাজ করা যাবে?

  • সংরক্ষণাগারটির ভিতরে কী আছে তা আমি কখনই জানি না। একটি ফোল্ডার হতে পারে, অনেক ফাইল হতে পারে।
  • আমি আর একটি সরঞ্জাম ব্যবহার করে ঠিক থাকব যদি টার এটি না করতে পারে।
  • আমি লম্বা ফর্মের সাথে ঠিক আছি যা স্ক্রিপ্টে রূপান্তরিত হতে পারে

সম্পাদনা
সম্পাদিত সময়ে আমি নিজেকে একটি স্ক্রিপ্ট হ্যাক করেছিলাম যা মনে হয় কাজটি শেষ হয়ে গেছে। (নীচে আমার পোস্ট উত্তর দেখুন)। যদি এটি উন্নত করা যায় তবে অনুগ্রহ করে মন্তব্য / অতিরিক্ত উত্তর পোস্ট করুন। মূল বিষয়টি হ'ল এটি এক-লাইনের মতো প্যাকেজযোগ্য হওয়া উচিত:

extract <file>

1
সংরক্ষণাগারটিতে সর্বদা ঠিক একটি ফোল্ডার থাকে?
মার্ক প্লটনিক 24


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

গড় সময়ে আমি একটি স্ক্রিপ্ট একসাথে পাই (নীচে দেখুন)। আমি উত্তরটি কেবল 2 দিনের মধ্যে গ্রহণ করতে পারি।
লিও উফিমটসেভ

সংরক্ষণাগারে কখনও শীর্ষ স্তরের একাধিক ফোল্ডার থাকতে পারে?
মার্ক প্লটনিক

উত্তর:


10

এর সাথে gnu tar, আপনি প্রতিটি ফাইলের নামটি পুনরায় চাপতে --xform(বা --transform) ব্যবহার করতে পারেন /prefix/:

tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'

নোট কোন নেতৃস্থানীয় এর /মধ্যে prefix/এবং sedসঙ্গে অভিব্যক্তি প্রান্ত Sফাইলের নাম রূপান্তরের থেকে সিম্বলিক লিঙ্ক লক্ষ্যমাত্রা বাদ দেওয়ার।
এটি পরীক্ষা করতে (শুকনো রান):

tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names

আপনাকে শুরু করার জন্য, এখানে একটি খুব সরল স্ক্রিপ্ট রয়েছে যা আপনি এই হিসাবে প্রার্থনা করতে পারেন extract <file>:

স্ট্রিপ = $ {1%। * St # স্ট্রিপ শেষ প্রত্যয়
NAME এর = $ {ফালা% .tar} #strip .tar প্রত্যয়, যদি বর্তমান
tar -xf "$ 1" --xfor = "s | ^ | $ NAME / | S" # রুন কমান্ড

এটি আমি যা চাই তার কাছাকাছি, ব্যতিক্রম ছাড়া আমি এটিকে এমন কিছুতে প্যাকেজ করতে সক্ষম হতে চাই: এক্সট্র্যাক্ট <ফাইল>
লিও উফিম্টসেভ

এটি বগি, এটি প্রথম বিন্দুতে থামে। উদাহরণস্বরূপ আমার কাছে এর মতো একটি ফাইল রয়েছে: গ্রহ-এসডি কে -৪.৫ এম--লিনাক্স-জিটিকে-x86_64.tar.gz আমি .tar.gz ব্যতীত একটি আউটপুট আশা করি তবে আমি গ্রহ-এসডিকে -4 পেয়েছি
লিও উফিমটসেভ

উপরের স্ক্রিপ্টে আমি এক্সটেনশানটি স্ট্রিপ করে এবং যদি 'টার' খুঁজে পাই তবে আরও স্ট্রিপ করব।
লিও উফিমটসেভ

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

ভাল জিনিস. এটি কাজ করে এবং আমি যে স্ক্রিপ্টটি লিখেছিলাম তার চেয়ে ছোট। নিস!
লিও উফিমটসেভ

7

ভাল, আপনি এটি কমপক্ষে কয়েক ধাপে করতে পারেন। যদি তুমি কর

mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>

এটি কাজটি সম্পাদন করবে, যদিও এখনও আরও একটি কমপ্যাক্ট উত্তর থাকতে পারে।


3

সম্পাদন করা

গৃহীত উত্তর নীচের চেয়ে কম। (একই জিনিসটি করুন তবে সংক্ষিপ্ততর সাধারণত ভাল হয়)।


শেষ পর্যন্ত আমি নিজে হাতে হাতের কাজটির জন্য একটি স্ক্রিপ্ট হ্যাক করেছি। এটি .tar .tar.gz এবং .gz এর সাথে কাজ করে

#!/bin/sh
#usage:
# nameOfScript myArchive.tar.gz
# nameOfScript myArchive.gz
# nameOfScript myArchive.tar
#
# Result:
# myArchive   //folder
fileName="${1%.*}" #extracted filename

#handle the case of archive.tar.gz
trailingExtension="${fileName##*.}"
if [ "$trailingExtension" == "tar" ]  
then
    fileName="${fileName%.*}"  #remove trailing  tar.
fi

mkdir "$fileName"
tar -xf "$1" --strip-components=0 -C "$fileName"

ব্যবহার:

   nameOfScript archive.tar.gz 
   ls 
    archive
   cd archive 
   ls 
    <archive content>

দ্রষ্টব্য, এই সমাধানটি কোনও ফাইলের নামে বিন্দুতে সক্ষম। যেমন Eclipse-4.5M-SDK.tar.gz।

আমি স্ক্রিপ্টটি আমার গিট রেপোতে রাখি। সর্বশেষ সংস্করণটির জন্য, দেখুন: https://github.com/LeoUfimtsev/ldts/blob/master/pathscriptts/leo-tar- এখানে


2

আরও একটি সম্ভাব্য সমাধান হ'ল --transformবিকল্পটি ব্যবহার করা :

tar -xzf ARCHIVE_NAME.tgz --transform="s/OLD_DIR_NAME/ARCHIVE_NAME/"

আপনার ফাইলগুলি সহ:

tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"

1
তবে এটি অনুমান করে যে আপনি সংরক্ষণাগারটির ভিতরে কী আছেন জানেন
লিও উফিমটসেভ

উদাহরণস্বরূপ সংরক্ষণাগারটির ভিতরে কী আছে তা না জেনে আমি কীভাবে এটি একটি এক-লাইনের স্ক্রিপ্টে পরিণত করব?
লিও উফিমটসেভ

আপনি ঠিক বলেছেন। আমি এখানে যেমন লিখেছি এটি কেবলমাত্র একটি সম্ভাব্য সমাধান ...
svq

যে এবং --strip-compoments = 0 আমারআর্কাইভ 123 এর মধ্যে কোনও পার্থক্য আছে?
লিও উফিমতসেভ

1
এবং --strip-components=0সোজা পথ থেকে প্রথম ডিরেক্টরি নামটি সরিয়ে দেয় এবং -Cবিকল্পের সাহায্যে নতুন ডিরেক্টরিতে ফাইল সংরক্ষণাগারভুক্ত করা হয় into
এসকিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.