আনটারিংয়ের সময় ডিরেক্টরি নাম কীভাবে চয়ন করবেন


124

বলুন আমার কাছে ফাইলের নাম আছে ugly_name.tar, যা নিষ্কাশনের পরে ugly_nameডিরেক্টরিতে পরিণত হয় । ফলস্বরূপ ডিরেক্টরি নামের pretty_nameপরিবর্তে এমন কোন আদেশ আমি ব্যবহার করতে পারি ?

উত্তর:


171

এই কাজ করা উচিত:

mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1

-Cআনপ্যাক করার আগে (বা প্যাকিং) নির্দিষ্ট ডিরেক্টরিতে পরিবর্তন। --strip-componentsসংরক্ষণাগারে সঞ্চিত ফাইলের নাম থেকে ডিরেক্টরিগুলির নির্দিষ্ট নম্বর সরিয়ে দেয়।

মনে রাখবেন যে এটি সত্যই বহনযোগ্য নয়। জিএনইউ টার এবং কমপক্ষে কিছু বিএসডি টারগুলির --strip-componentsবিকল্প রয়েছে তবে অন্যান্য ইউনিক্সের মতো প্ল্যাটফর্মে উপস্থিত বলে মনে হচ্ছে না।

এটি করার বোবা উপায় যদিও বেশিরভাগ জায়গায় কাজ করবে।

tar xf ugly_name.tar && mv ugly_name pretty_name

আমি মনে করি আমি বোবা সংস্করণটির সাথে
লেগে থাকব

28
@ ফুনেহে: স্মার্ট সংস্করণটির একটি সুবিধা হ'ল আপনাকে অবিকৃতভাবে জানতে হবে না যে
অচিহ্নবদ্ধ

2
আমি যুক্ত করতে পারি, এটি "প্রিটি_নাম" এর চেয়ে বেশি কাজ করে। আপনি কোনও নির্দিষ্ট ডিরেক্টরিতেও এভাবে অনারত করতে পারেন। উদাহরণ:tar -xvf /tmp/backupfiles.tar -C /var/www/
জেনারেল রেডনেক

2
আমি সাধারণত বোবা উপায় ব্যবহার করি এবং কুৎসিত নামটি কী হবে তা আমি জানি না বা আমি এটি লিখতে চাই না এমন ক্ষেত্রে আমি ওয়াইল্ডকার্ড ব্যবহার করি। mv ugly-* pretty_name
ডেভিড গ্রেসন

1
ইতিমধ্যে কোনও ugly_nameডিরেক্টরি থাকলে বোবা উপায় কাজ করে না । যাইহোক, সৌন্দর্য দর্শকের চোখে পড়ে।
কিমিক্লাস

30

সঙ্গে গনুহ আলকাতরা ≥1.16, ব্যবহার --transform(রূপান্তর সংরক্ষণাগারে সম্পূর্ণ পাথ উপর প্রয়োগ করা হয়) প্রতিটি ফাইল নামে একটি sed regexp রূপান্তর প্রয়োগ করতে:

tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'

যদি ugly_nameসংরক্ষণাগারটিতে থাকা সমস্ত ফাইলের নামের শীর্ষস্থানীয় উপাদান হয়, আপনাকে সুনির্দিষ্ট মিলের সাথে বিরক্ত করার দরকার নেই:

tar xf foo.tar --transform 's/ugly_name/pretty_name/'

আপনি যদি শীর্ষস্থানীয় ডিরেক্টরিটির নাম জানেন না, আপনি তারপরেও পছন্দ করতে পারেন তবে আপনি এই পদ্ধতিটি এখনও ব্যবহার করতে পারেন --strip-components

tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'

এর সাথে pax, পসিক্স সংরক্ষণাগার ইউটিলিটিটি -sবিকল্পটি ব্যবহার করুন যা একটি আর্গুমেন্ট হিসাবে সিডের মতো প্রতিস্থাপনের অভিব্যক্তি গ্রহণ করে।

pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'

9

এটা ব্যবহার কর :

tar -xvf ugly_name.tar
mv ugly_name pretty_name

9
আপনি &&এই দুটি কমান্ডের মধ্যে তালিকা অপারেটর ব্যবহার করতে পছন্দ করতে পারেন , তাই দ্বিতীয়টি কেবল তখনই কার্যকর হয় যদি প্রথমটি সফল হয়।
manatwork

1
যদি কোনও ডিরেক্টরি ugly_nameইতিমধ্যে বিদ্যমান থাকে তবে এর অনাকাঙ্ক্ষিত পরিণতি হতে পারে ।
ড্রু ডোরম্যান

7

সহজ উপায়

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1

(1) এটা স্পষ্ট সহজ উপায় নয়, যেমন smac89 একটি উত্তর পোস্ট সমন্বিত --one-top-level=pretty_nameছাড়া --strip-components 1। (২) বিপরীতে, গৃহীত উত্তর (মাদুর দ্বারা পোস্ট করা)--strip-components 1 ছাড়া বৈশিষ্ট্যগুলি রয়েছে --one-top-level=pretty_name। (৩) আপনার উত্তরগুলি, কেন এই বিকল্পগুলির সংমিশ্রণটি কোনও প্রবীণদের চেয়ে ভাল বলে আপনি ব্যাখ্যা করতে পারেন? মন্তব্যে প্রতিক্রিয়া জানাতে দয়া করে;  আপনার উত্তরটি আরও পরিষ্কার এবং আরও পরিপূর্ণ করতে সম্পাদনা করুন।
জি ম্যান

সম্ভবত একটি বাস্তব উদাহরণ আপনাকে স্পষ্ট করতে সহায়তা করতে পারে: ` উইজেট ডেভ.মাইএসকিএল.সেট /ডাউনলোডস / মাইএসকিউএল ৫..7 // টার এক্সভিএফ mysql-5.7.23-লিনাক্স-গ্লিবসি 2.12-x86_64.tar.gz - এক-শীর্ষ -লেভেল = mysql57 - স্ট্রিপ-উপাদানগুলি 1 `
মার্চিকাস

এই উত্তরটি সর্বাধিক উত্সাহিতের চেয়ে আরও মার্জিত ।
কায়ারকাটজে

@ জি-ম্যানের --strip-component 1প্রয়োজন হয় পদ্ধতি mkdirবা --strip-components 1পদ্ধতি সহ, অন্যথায় আপনি কেবল পান pretty_name/ugly_name/
ডেভিডা

এটি সত্যই সহজ উপায়
smac89

2

জিজ্ঞাসা উবুন্টু থেকে, এই উত্তরটি আমার পক্ষে কাজ করেছে:

tar zxvf ugly_name.tgz --one-top-level=pretty_name

`--One-টপ লেভেল [= Dir]

এক্সট্রাকশন ডিরেক্টরিটির নীচে একটি নতুন ডিরেক্টরি তৈরি করতে টারকে বলে (বা একটিটি `-C 'তে চলে গেছে) এবং টারবম্বগুলির বিরুদ্ধে রক্ষা করতে এটি ব্যবহার করুন use দির যুক্তির অনুপস্থিতিতে, নতুন ডিরেক্টরিটির নাম সংরক্ষণাগারটির মূল নামের সমান হবে (ফাইলের নাম বিয়োগের সংরক্ষণাগার প্রত্যয়টি যদি স্বীকৃত হয়)। যে ডিরেক্টরি সদস্যের নামের সাথে শুরু হয় না এমন কোনও সদস্যের নাম (`--transfor 'এবং` - স্ট্রিপ-উপাদানগুলি' র পরিবর্তনের পরে) এর সাথে উপসর্গ করা হবে। স্বীকৃত ফাইল নামের প্রত্যয়গুলি হ'ল tar .tar 'এবং যে কোনও সংকোচনের প্রত্যয় দেখুন -অটো-সংক্ষেপণের দ্বারা সনাক্তযোগ্য


হালনাগাদ

মন্তব্যে নির্দেশিত হিসাবে , এই পদ্ধতিটি সংরক্ষণাগারগুলির জন্য কার্যকরভাবে কাজ করে না যা সঠিকভাবে গঠন করা হয়, তবে অন্য উত্তর হিসাবে দেখা যায়, আপনার --strip-components 1সত্যিকারের কাজ করার জন্য এটি যুক্ত করা উচিত । আমি এই নতুন বিকল্পটি দিয়ে পরীক্ষা করেছি এবং এটি শীর্ষ স্তরের নাম এবং বাদে সংরক্ষণাগারগুলির জন্য উভয়ই কাজ করে।


এটির সাথে সমস্যাটি হ'ল এটি শীর্ষ স্তরের ডিরেক্টরিটির নাম পরিবর্তন করে না, পরিবর্তে এটি একটি নতুন স্তর তৈরি করে যার নাম দেওয়া হয় pretty_nameযার মধ্যে মূল শীর্ষ স্তরের ডিরেক্টরি রয়েছে। উদাহরণস্বরূপ, যদি tar xzf ugly_name.tgzকোনও ডিরেক্টরি বলা হয় ugly_name/, তবে আপনার প্রদত্ত কমান্ডটি তৈরি করবে pretty_name/ugly_name/
ডেভিডা

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