কেবলমাত্র টার ফাইল, কোনও ডিরেক্টরি নেই


16

আমি কেবল ফাইলগুলি খুঁজতে শেল স্ক্রিপ্টটি লিখতে পারি, তারপরে তালিকায় টর্কে পাস করতে পারি, তবে আমি ভাবছি যে ইতিমধ্যে টারে একটি অন্তর্নির্মিত বৈশিষ্ট্য রয়েছে যা কেবলমাত্র একক কমান্ড লাইনে কেবল এটি করার অনুমতি দেয়?

উদাহরণস্বরূপ, আমি --no-recursionস্যুইচটি পেয়েছি , কিন্তু যখন আমি এটি করি:

tar --no-recursion -cvf mydir.tar mydir

এটি কেবল ডিরেক্টরিতে অন্তর্ভুক্তিগুলির নাম সংরক্ষণ করে (উপ-ডিরেক্টরিগুলি সহ!) তবে এটি কোনও ফাইল সংরক্ষণাগার করে না।

আমি চেষ্টাও করেছি:

 tar --no-recursion -cvf mydir.tar mydir/*

তবে এটি কেবল ফাইল সংরক্ষণাগারভুক্ত করার সময় এটি উপ-ডিরেক্টরিগুলির নামও সংরক্ষণাগারভুক্ত করে ।

কেবলমাত্র টার ফাইলগুলি বলার উপায় আছে, কোনও ডিরেক্টরি নেই?


5
কেবল পরিষ্কার করতে: আপনি কি "ফ্ল্যাট" কাঠামো (যেমন সমস্ত ডিরেক্টরি একটি ডিরেক্টরিতে মিশ্রিত) দিয়ে একটি সংরক্ষণাগার তৈরি করতে চান?
rozcietrzewiacz

1
আপনি একটি নতুন ডিরেক্টরি তৈরি করতে পারেন find mydir -type f |xargs cp -t tempdirএবং তারপরে টেম্পডির।
কেভিন

@rozcietrzewiacz হ্যাঁ, ফ্ল্যাট, কিন্তু কেবল সেই ডিরেক্টরি থেকে, সাব-ডিরেক্টরি থেকে নয়।
ateiob

1
ঠিক আছে, আমি মনে করি আপনি যা করতে চাইছেন তা আমি দেখছি। কীভাবেfind mydir -depth 1 -type f | xargs tar cf mydir.tar
কেভিন

2
আহ, স্পেস খোঁজ ব্যবহার করুন পরিবর্তে -exec আছে: find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} ++রাখে সব xargs মত একই কমান্ড লাইন ফাইল।
কেভিন

উত্তর:


11

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

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar Avf mydir.tar
find mydir -maxdepth 1 -type f -exec tar Avf mydir.tar {} +

Iocnarz এর উত্তর ব্যবহারের tarএর --nullএবং -Tঅপশন যেমন ভাল কাজ করে। আপনি যদি cpioইনস্টল করে থাকেন তবে এটি ব্যবহার করে ক্যামের উত্তরটিও ঠিক আছে। এবং যদি আপনার কাছে zshএটি থাকে এবং এটি কোনও কমান্ডের জন্য ব্যবহার করতে আপত্তি না করে তবে জিলস গ্লোব ( *(.)) ব্যবহার করে গিলসের উত্তর সবচেয়ে সহজ বলে মনে হয়।


কীটি ছিল -maxdepthবিকল্প। চূড়ান্ত উত্তর, স্পেসগুলি যথাযথভাবে ডিল করে:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar cvf mydir.tar

এটিও কাজ করা উচিত:

find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +

4
এই দুটিরই একাধিক আহ্বানের ফলাফল হতে পারে tar। উভয় xargsএবং ভেরিয়েন্টের findসাথে +সর্বাধিক সংখ্যক যুক্তি রয়েছে যা টর্কে যেতে পারে। এর ফলে প্রথমটির আউটপুট ওভাররাইটিংয়ের দ্বিতীয় অনুরোধ হবে।
ক্যাম এএইচ

2
Xargs সীমাতে প্রসারিত, সর্বাধিক 128KiB কমান্ড লাইনে xargs ডিফল্ট। যদি ফাইলের তালিকাটি বৃহত্তর হয়, আপনি সেকেন্ড (বা আরও) কমান্ডের (ডাবল) অনুরোধ পাবেন, যা নীরব ডেটা হারাতে পারে। আপনি -xডেটা হারানোর পরিবর্তে জার্সগুলিকে ব্যর্থ করতে জোর করতে ব্যবহার করতে পারেন এবং নীরব ডেটা হ্রাস বাগের চেয়ে ভাল, এটি এখনও আদর্শ নয়। এই সাজানোর বাগটি এত বিপজ্জনক যেহেতু প্রথমে সবকিছু ঠিকঠাক বলে মনে হচ্ছে, তবে সময়ের সাথে সাথে ফাইল তালিকাটি বাড়ার সাথে সাথে আপনি এটি ট্রিগার শুরু করে এবং আপনার ব্যাকআপটি পুনরুদ্ধার করার চেষ্টা না করা পর্যন্ত খেয়াল করবেন না। তাহলে অনেক দেরি হয়ে গেছে।
ক্যাম এএইচ

@ ক্যামহ আপনি ঠিক বলেছেন, এটি নির্দেশ করার জন্য ধন্যবাদ; আমি প্রতিফলিত আপডেট করেছি।
কেভিন

1
"চূড়ান্ত উত্তর" সঠিক নয়, আপনি যদি -T ছাড়াই "টার সি" ব্যবহার করেন তবে আপনি আংশিক ফলাফল পেতে পারেন।

14

আপনি ব্যবহার করতে চান, তখন findসঙ্গে tar, সবচেয়ে ভালো উপায় ব্যবহার করা cpioপরিবর্তে tarcpioটার আর্কাইভ লিখতে পারে এবং স্টিডিন থেকে সংরক্ষণাগার ফাইলের তালিকা নিতে ডিজাইন করা হয়েছে।

find mydir -maxdepth 1 -type f -print0 | cpio -o -H ustar -0 > mydir.tar

ব্যবহার করা findএবং cpioএটি একটি আরও ইউনিক্স-ওয়াই পন্থা যা আপনি যে findসমস্ত ক্ষমতা দিয়ে ফাইল নির্বাচনটি cpioকরতে দিয়েছিলেন এবং সংরক্ষণাগারটি করতে দিন । এটির এই সাধারণ ব্যবহারটি শেখার পক্ষে মূল্যবান cpio, কারণ আপনি যখন চেষ্টা করছেন তখন আপনি যে সমস্যার সামনে এগিয়ে যান তার সমাধান করা সহজ বলে মনে করেন tar


উজ্জ্বল! আমি সুদূর অতীতে সিপিও ব্যবহার করেছি, তবে ustar বিকল্পটি কখনও জানতাম না।
ইয়ান ম্যাকগোয়ান

2
এটি আমার পক্ষে গৃহীত উত্তরের চেয়ে অনেক ভাল কাজ করেছে।
ডেল অ্যান্ডারসন

1
শুধু একটি নিট -ম্যাক্সডেপথ 1 টি-টাইপ চ এর আগে আসা উচিত বা আপনি কিছু সন্ধান থেকে একটি সতর্কতা পাবেন
কেডাবস

ধন্যবাদ @ কেডাবস আমি উত্তর রাখার -maxdepthআগে আপডেট করেছি -type
ক্যামে

3

আমি নিশ্চিত নই যে আমি আপনার প্রয়োজনীয়তাগুলি বুঝতে পেরেছি। আপনি যদি নিয়মিত ফাইলগুলি mydirতার সাব-ডিরেক্টরিতে না রেখে সঞ্চয় করতে চান তবে সবচেয়ে সহজ উপায় হল zsh ব্যবহার করা, যেখানে নিয়মিত ফাইলগুলির সাথে কেবল মিলানোই . গ্লোব কোয়ালিফায়ার ব্যবহারের সহজ বিষয় :

tar cf mydir.tar mydir/*(.)

3

আপনি এমনকি ব্যবহার না করে find ... -print0এবং tar ... --nullসরাসরি ব্যবহার করতে পারেন xargs

find . -maxdepth 1 -type f -print0 | tar cvf mydir.tar --null -T -

প্রদত্ত উদাহরণে, --no-recursionবিকল্পটি tarঅপরিহার্য নয় কারণ কেবল ফাইলগুলির পাথ (এবং ডিরেক্টরি নয়) থেকে পাস করা findহবে tar

নিম্নলিখিত উদাহরণটিতে --no-recursionবিকল্পটি ব্যবহার করে tarতবে tarডাবল আর্কাইভ ডিরেক্টরি থেকে বিরত থাকে। findএর পরিবর্তে ডিরেক্টরি ট্রি পুনরাবৃত্তি করবে tar

# compare
find . -print0 | tar cf mydir.tar --null -T -
tar -tf mydir.tar | nl

find . -print0 | tar cf mydir.tar --null --no-recursion -T -
tar -tf mydir.tar | nl

2

man tar(শেষ বাক্য) প্রারম্ভিক অনুচ্ছেদে যেমন বলা হয়েছে,

ডিরেক্টরি নামের ব্যবহার সর্বদা বোঝায় যে নীচের সাব-ডিরেক্টরিগুলি সংরক্ষণাগারে অন্তর্ভুক্ত করা উচিত।

যা আপনার প্রশ্নের "না" উত্তর হিসাবে আমি বুঝতে পারি।


গুড ধরা ছাড়া আলকাতরা এখন অনেক বর্জন meachisms অন্তর্ভুক্ত (যেমন --no-recursion, --exclude-tag, ইত্যাদি)। আমি --exclude-tagযা খুঁজছি প্রতিশ্রুতিবদ্ধ কিন্তু আমি যা খুঁজছি তার ঠিক বিপরীত বলে মনে হচ্ছে।
এটিওব

আমি এটি চেষ্টা করে দেখলাম দীর্ঘ পথের নামগুলি থেকে অক্ষরগুলি সরানো হচ্ছে। ক্যামের প্রস্তাবিত হিসাবে -T এবং --null সহ টার ব্যবহার করা এই সমস্যাটি এড়ায়।
পল ব্রান্নান

1
star -c -C startdir -find . ! -type d > out.tar

ফেরত -C startdirএবং প্রতিস্থাপন .সঙ্গে startdirযদি এটা সংরক্ষণাগারে প্রদর্শিত হওয়া উচিত।

এটি লাইবফাইন্ডের বৈশিষ্ট্যগুলির ভিত্তিতে সবচেয়ে কার্যকর পদ্ধতি। লিবিফাইন্ড প্রাইমারিগুলিও সরবরাহ করে -chown -chgrp -chmodযা স্থানে স্ট্রাক স্ট্যাট পরিবর্তন করে এবং বিভিন্ন মেটাডেটা সংরক্ষণাগারভুক্ত করে। এটি তালিকা এবং নিষ্কাশন মোডেও কাজ করে এবং অনেক ক্ষেত্রে পুরো সংরক্ষণাগারটি বের করার প্রয়োজনকে এড়িয়ে চলে।


আপনি ব্যবহার করতে পারেন -findমধ্যে -copyমোড। ম্যান পেজ সংক্ষিপ্তসারটি আপনাকে পরামর্শ দিতে পারে তবে আমি এটি কাজ করতে সক্ষম হইনি ( ফোল্ডারের কাঠামো সংরক্ষণের সময় পরিবর্তিত ফাইলগুলি কীভাবে কপি করতে হবে তার উত্তর দেওয়ার চেষ্টা করতে গিয়ে ) (স্কিলি -2016-02-10 সহ)
স্টাফেন চেজেলাস

আমি এটি দীর্ঘ সময়ের জন্য পরীক্ষা করিনি। এটি সম্ভবত একটি বাগ আছে যে হতে পারে। ম্যান পেজটি বলেছে যে শেষ যুক্তিটি নিষ্কাশন ডিরেক্টরি হবে তবে আমি যখন এটি চেষ্টা করব তখন আমি পেয়েছি: "পাথ আর্গুমেন্টগুলি এখনও নিষ্কাশন মোডে সমর্থিত নয়"। আপনি চেষ্টা করার পরে আপনি কি এটি পেয়েছেন?
ধীরে ধীরে

হ্যাঁ. ম্যান পেজটি আরও বলেছে যে আপনি কেবলমাত্র ফাইন্ডের পরে যুক্তিগুলি খুঁজে পেতে পারেন তবে আমি যদি গন্তব্য ডিরেক্টরিটি আগে-ফাইন্ডের আগে রাখি তবে আমি একটি ত্রুটিও পেয়েছি
স্টাফেন চ্যাজেলাস

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

1
সোর্সফোরেজ.ন.প্রজ / প্রকল্পগুলি / স্পিলিওলসস / ফাইলস / স্পিলি ২০১-201-০৩-১০.আর.বিজে ২ এ চতুর সরঞ্জামগুলিতে এখন একটি চূড়ান্ত সমাধান প্রকাশিত হয়েছে এটি তারার নিখোঁজ সেটলোকেল () থেকে একটি সমস্যাও সমাধান করে এবং এটি সক্ষম করে - সি পরিচালক জন্য star -find
স্কিলি

0

আমি একটি সমাধান খুঁজে পেতে পারে।

find mydir -type f -printf '%P\0'|tar czvf mydir.tar.gz -C mydir --null -T -

এটি সামান্য ব্যয়বহুল হতে পারে তবে যাইহোক এটি কাজ করবে, কারণ এটি xargs এর উপর নির্ভর করে না।


-1

দির = আপনার_ডির; সিডি $ দির; tar -cvf file.tar `সন্ধান করুন। -ম্যাক্সডেপথ 1-টাইপ চ-প্রিন্ট`

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