ডিরেক্টরিটি অন্তর্ভুক্ত না করে আমি কীভাবে ফাইল এবং ফোল্ডারগুলির একটি ডিরেক্টরিকে ট্যারি করব?


382

আমি সাধারণত:

tar -czvf my_directory.tar.gz my_directory

আমি যদি কেবল_আর ডিরেক্টরিতে সমস্ত কিছু (কোনও লুকানো সিস্টেম ফাইল সহ) অন্তর্ভুক্ত করতে চাই, তবে ডিরেক্টরিটি নিজেই নয়? আমি চাই না:

my_directory
   --- my_file
   --- my_file
   --- my_file

আমি চাই:

my_file
my_file
my_file

এটা কি ডিফল্ট আচরণ tar -czf? আমার ক্ষেত্রে এটি কেবল ফাইলগুলি সঞ্চয় করে থাকে ডিরেক্টরিটি নয়। যখন আমি কেবল tarডিরেক্টরিটি অন্তর্ভুক্ত করি তবে tar -czfএটি কেবল ফাইল যুক্ত করে।
দুর্গা স্বরূপ

উত্তর:


233
cd my_directory/ && tar -zcvf ../my_dir.tgz . && cd - 

কাজ এক লাইনে করা উচিত। এটি লুকানো ফাইলগুলির জন্যও ভাল কাজ করে। "*" কমপক্ষে ব্যাশে পথের নাম প্রসারণ দ্বারা লুকানো ফাইলগুলি প্রসারিত করে না। নীচে আমার পরীক্ষা:

$ mkdir my_directory
$ touch my_directory/file1
$ touch my_directory/file2
$ touch my_directory/.hiddenfile1
$ touch my_directory/.hiddenfile2
$ cd my_directory/ && tar -zcvf ../my_dir.tgz . && cd ..
./
./file1
./file2
./.hiddenfile1
./.hiddenfile2
$ tar ztf my_dir.tgz
./
./file1
./file2
./.hiddenfile1
./.hiddenfile2

2
এটি ফাঁকা স্থান বা অন্যান্য বিশেষ অক্ষরের ফাইলগুলিতেও কাজ করবে। ভাল করেছ!
PanCrit

29
নিখুঁত নয় - টার ফাইলটিতে রয়েছে '। এবং কেবল ফাইল ফাইলের পরিবর্তে ./file1। আন-ট্যারিংয়ের সময় - স্ট্রিপ-উপাদানগুলি ব্যবহার করার জন্য আমি নীচে মাতুজা দ্বারা সমাধানটি পছন্দ করি।
ইভান

23
@ ইভান আপনি যদি প্রতিস্থাপন .করেন *তাই আদেশটি কার্যকর হবে cd my_directory/ && tar -zcvf ../my_dir.tgz * && cd ..তবে এটি আপনার প্রত্যাশা অনুযায়ী কাজ করবে।
বেনামে

3
@ জ্যামতহে আপনি একটি সাব-শেলও ব্যবহার করতে পারেন যাতে আপনার বর্তমান শেলটির কার্যকরী ডিরেক্টরিটি পরিবর্তন না হয়:$ (cd my_directory/ && tar -zcvf ../my_dir.tgz .)
অ্যালেক

আমি জানি এটি একটি পুরানো উত্তর তবে cdডিরেক্টরিগুলিতে প্রবেশ করানো এবং বেশ লম্পট। কমপক্ষে ব্যবহার করতে পারি pushdএবং popdযদি tarকোনও পতাকা পছন্দ না করে -C
অ্যান্ডিস

667

-Cটারের স্যুইচটি ব্যবহার করুন :

tar -czvf my_directory.tar.gz -C my_directory .

-C my_directoryআলকাতরা বলে বর্তমান ডিরেক্টরির পরিবর্তন করতে my_directory, এবং তারপর .মানে (লুকানো ফাইল এবং একটি উপ-ডিরেক্টরির সহ) "সমগ্র বর্তমান ডিরেক্টরী জুড়ুন"।

নিশ্চিত হয়ে নিন যে আপনি -C my_directoryকরার আগে আপনি করছেন .বা অন্যথায় আপনি বর্তমান ডিরেক্টরিতে ফাইলগুলি পাবেন।


5
+1 আপনাকে ধন্যবাদ! এটা ছিল অভিশাপ '। আমি নিখোঁজ ছিলাম। এতই
বাড়াবাড়ি

14
"সবচেয়ে অপশন মতো -C বিন্দু ফাইল প্রক্রিয়া হওয়ার তালিকা মধ্যে ঘটে এ প্রক্রিয়া নিম্নলিখিত কমান্ড বিবেচনা করুন:। tar --create --file=foo.tar -C /etc passwd hosts -C /lib libc.a" Apl.jhu.edu/Misc/Unix-info/tar/tar_65.html আমি সবসময় চেষ্টা tar -czvf my_directory.tar.gz * -C my_directoryএবং যে কাজ করে না। -Cঅবস্থান গুরুত্বপূর্ণ!
হাহাকার

57
নিখুঁত নয় - টার ফাইলটিতে রয়েছে '। এবং কেবল ফাইল ফাইলের পরিবর্তে ./file1। আন-ট্যারিংয়ের সময় - স্ট্রিপ-উপাদানগুলি ব্যবহার করার জন্য আমি নীচে মাতুজা দ্বারা সমাধানটি পছন্দ করি।
ইভান

3
@ সুপেরোল: শেলটি ট্যারি চালানোর আগে ওয়াইল্ডকার্ডকে প্রতিস্থাপন করে। এছাড়াও নোট করুন যে ওয়াইল্ডকার্ড ব্যবহারের মতো *লুকানো ফাইল (যা আসল প্রয়োজন ছিল) অন্তর্ভুক্ত করবে না।
দুবেক

28
এটি তৈরি করে। .tar.gz এ মূল ডিরেক্টরি হিসাবে।
বেনামে

59

আপনি যথারীতি সংরক্ষণাগার তৈরি করতে এবং এটি দিয়ে বের করতে পারেন:

tar --strip-components 1 -xvf my_directory.tar.gz

3
আপনার প্রয়োজনীয়তার সমস্ত জানা হওয়ার আগে আপনি তৈরি টারবলগুলির সাথে কাজ করছেন এমন পরিস্থিতিতে এই সমাধানটি বিশেষত উত্তম ...
ডিপগার

2
মাইন্ড এটি --strip-componentsএকটি জিএনইউ এক্সটেনশন।
zneak

2
এই উত্তরটি প্রসঙ্গে "যথারীতি" উদাহরণ সরবরাহ করে উন্নত করা যেতে পারে।
জোশ হাবদাস

33

কটাক্ষপাত আছে --transform/ --xform, আপনার ফাইলের নাম ম্যাসেজ সুযোগ হিসেবে ফাইল সংরক্ষণাগার যোগ করা হয় দেয়:

% mkdir my_directory
% touch my_directory/file1
% touch my_directory/file2
% touch my_directory/.hiddenfile1
% touch my_directory/.hiddenfile2
% tar -v -c -f my_dir.tgz --xform='s,my_directory/,,' $(find my_directory -type f)
my_directory/file2
my_directory/.hiddenfile1
my_directory/.hiddenfile2
my_directory/file1
% tar -t -f my_dir.tgz 
file2
.hiddenfile1
.hiddenfile2
file1

রূপান্তর অভিব্যক্তি এর অনুরূপ sed, এবং আমরা পৃথক পৃথক ব্যবহার করতে পারি /( ,উপরের উদাহরণে)।
https://www.gnu.org/software/tar/manual/html_section/tar_52.html


3
আমি এটা করতে হবে। অন্য কিছু ঠিক একটি হ্যাক!
jwg

2
এটি একটি আরও ভাল সমাধান।
লেসেই

এটিই সেরা সমাধান।
justhalf

1
ভাল সমাধান, কিন্তু এটি হতে পারে file list too longআমার সমাধান এটি প্রতিরোধ করে এবং পাশাপাশি আরও নমনীয়।
aross

এটি একটি দুর্দান্ত সমাধান। আপনি --xformএকাধিক পাথের জন্য একাধিকবারও পার করতে পারেন ।
এলিগ

26

টি এল; ডিআর

find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -

কিছু শর্ত সহ (কেবল ফাইল, ডায়ার এবং সিমলিংক সংরক্ষণাগার):

find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -

ব্যাখ্যা

নীচে দুর্ভাগ্যক্রমে ./সংরক্ষণাগারটিতে একটি পিতামহিত ডিরেক্টরি অন্তর্ভুক্ত রয়েছে :

tar -czf mydir.tgz -C /my/dir .

--transformকনফিগারেশন বিকল্পটি ব্যবহার করে আপনি ডিরেক্টরিটি থেকে সমস্ত ফাইল সরিয়ে নিতে পারেন , তবে এটি .ডিরেক্টরি থেকে নিজেকে মুক্তি দেয় না । কমান্ডকে দমন করা ক্রমশ কঠিন হয়ে পড়েছে।

আপনি $(find ...)কমান্ডটিতে ফাইল তালিকা যুক্ত করতে ব্যবহার করতে পারেন ( ম্যাগনাসের উত্তরের মতো ), তবে এটি সম্ভবত একটি "ফাইল তালিকা খুব দীর্ঘ" ত্রুটির কারণ হতে পারে। সর্বোত্তম উপায় হ'ল এটিকে টার এর -Tবিকল্পের সাথে একত্রিত করা :

find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -

মূলত এটি যা করে তা হ'ল আপনার ডিরেক্টরিতে থাকা সমস্ত ফাইল ( -type f), লিঙ্কগুলি ( -type l) এবং উপ-ডিরেক্টরিগুলি ( -type d) তালিকাভুক্ত করে -printf "%P\n", সমস্ত ফাইলের নাম ব্যবহার করে তুলনামূলকভাবে তৈরি করে , এবং তারপরে তা টার কমান্ডে প্রেরণ করুন (এটি এসটিডিআইএন ব্যবহার করে ফাইলের নাম নেয় -T -)। -Cবিকল্প প্রয়োজন তাই আলকাতরা জানেন যেখানে আপেক্ষিক নামের সাথে ফাইলগুলিকে চিহ্নিত হয়। --no-recursionপতাকা, যাতে আলকাতরা ফোল্ডার এটি (ডুপ্লিকেট ফাইল করে) সংরক্ষণাগার বলা হয় মধ্যে recurse না।

যদি আপনাকে ফাইলের নাম (ফিল্টারিং, সিমলিঙ্কগুলি অনুসরণ করে) এর সাথে বিশেষ কিছু করার দরকার হয় তবে findকমান্ডটি বেশ শক্তিশালী এবং tarউপরের কমান্ডের অংশটি সরিয়ে আপনি এটি পরীক্ষা করতে পারেন :

$ find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d
> textfile.txt
> documentation.pdf
> subfolder2
> subfolder
> subfolder/.gitignore

উদাহরণস্বরূপ, যদি আপনি পিডিএফ ফাইলগুলি ফিল্টার করতে চান তবে অ্যাড করুন ! -name '*.pdf'

$ find /my/dir/ -printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d
> textfile.txt
> subfolder2
> subfolder
> subfolder/.gitignore

নন-জিএনইউ অনুসন্ধান করুন

কমান্ডটি ব্যবহার করে printf(জিএনইউতে উপলব্ধ find) যা সম্পর্কিত findফলাফলগুলি সহ এর ফলাফলগুলি মুদ্রণ করতে বলে । তবে আপনার যদি জিএনইউ না থাকে তবে findএটি পাথগুলি আপেক্ষিক করে তুলতে কাজ করে (এর সাথে পিতামাতাকে সরিয়ে দেয় sed):

find /my/dir/ -type f -o -type l -o -type d | sed s,^/my/dir/,, | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -

2
দুর্দান্ত উত্তর। খুব বিস্তৃত এবং সবচেয়ে গুরুত্বপূর্ণ, সমস্যাটিকে নিখুঁতভাবে সমাধান করে।
অ্যালেক্স

16

এই উত্তরটি বেশিরভাগ পরিস্থিতিতে কাজ করা উচিত। তবে লক্ষ্য করুন কিভাবে ফাইলের নাম,, যেমন আলকাতরা ফাইলে সংরক্ষণ করা হয় উদাহরণস্বরূপ ./file1বরং তুলনায় file1। আমি খুঁজে পেয়েছি যে বিল্ডরूटে প্যাকেজ ফাইল হিসাবে ব্যবহৃত টার্বলগুলি ব্যবহার করার জন্য এই পদ্ধতিটি ব্যবহার করার সময় সমস্যা দেখা দিয়েছে

একটি সমাধান হ'ল ..এই ফাইলগুলি বাদ দিয়ে সমস্ত ফাইল তালিকাবদ্ধ করতে কিছু ব্যাশ গ্লোব ব্যবহার করা :

tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *

এই কৌশলটি আমি এই উত্তরটি থেকে শিখেছি ।

এখন কোনও ফাইল মেলানো না থাকলে টার একটি ত্রুটি ফিরিয়ে দেবে ..?* বা.[^.]* , তবে এটি এখনও কাজ করবে। ত্রুটিটি যদি সমস্যা হয় (আপনি কোনও স্ক্রিপ্টে সাফল্যের জন্য যাচাই করছেন), এটি কাজ করে:

shopt -s nullglob
tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
shopt -u nullglob

যদিও এখন আমরা শেল বিকল্পগুলির সাথে জগাখিচুড়ি করছি, আমরা সিদ্ধান্ত নিতে পারি যে এটি করা আরও নিকৃষ্ট * লুকানো ফাইলগুলি ম্যাচ করা ভাল:

shopt -s dotglob
tar -C my_dir -zcvf my_dir.tar.gz *
shopt -u dotglob

*বর্তমান ডিরেক্টরিতে আপনার শেল গ্লোবগুলি যেখানে এটি কাজ করবে না তাই বিকল্পভাবে, ব্যবহার করুন:

shopt -s dotglob
cd my_dir
tar -zcvf ../my_dir.tar.gz *
cd ..
shopt -u dotglob

1
আমি যখন এটি করি তখন আমি আরও ত্রুটিযুক্ত ত্রুটি পেয়েছি tar: start.sh: Cannot stat: No such file or directoryআমার বর্তমান ডিরেক্টরিতে থাকা সমস্ত ফাইলের ক্ষেত্রে এটি ঘটে! আমি কীভাবে এড়াতে পারি?
ব্রেইনস্টোন

@ ব্রেনস্টোন আমি ঠিক একই ফলাফল পেয়েছি।
mbmast

15
cd my_directory
tar zcvf ../my_directory.tar.gz *

2
হ্যাল স্পষ্টভাবে লুকানো ফাইল সম্পর্কে জিজ্ঞাসা। আপনারও দরকার। ?? *।
প্যানক্রিট

2
-1: এটি লুকানো ফাইলগুলি টারে যুক্ত করে না। টিবিম্যানের উত্তর দেখুন।
দুবেক

3

যদি এটি কোনও ইউনিক্স / লিনাক্স সিস্টেম হয় এবং আপনি লুকানো ফাইলগুলি (যা * দ্বারা মিস হয়ে যায়) সম্পর্কে যত্নশীল হন তবে আপনার এটি করতে হবে:

cd my_directory
tar zcvf ../my_directory.tar.gz * .??*

উইন্ডোজের নীচে লুকানো ফাইলগুলি দেখতে কেমন তা আমি জানি না।


2

আমি নীচের বাশ ফাংশনটি প্রস্তাব করব (প্রথম যুক্তি হ'ল দিরের পথ, দ্বিতীয় যুক্তিটি ফলাফলের সংরক্ষণাগারের ভিত্তি নাম):

function tar_dir_contents ()
{
    local DIRPATH="$1"
    local TARARCH="$2.tar.gz"
    local ORGIFS="$IFS"
    IFS=$'\n'
    tar -C "$DIRPATH" -czf "$TARARCH" $( ls -a "$DIRPATH" | grep -v '\(^\.$\)\|\(^\.\.$\)' )
    IFS="$ORGIFS"
}

আপনি এটি এইভাবে চালাতে পারেন:

$ tar_dir_contents /path/to/some/dir my_archive

এবং এটি my_archive.tar.gzবর্তমান ডিরেক্টরিতে সংরক্ষণাগার তৈরি করবে । এটি লুকানো (। *) উপাদানগুলির সাথে এবং তাদের ফাইলের নামের ফাঁকা স্থানগুলির সাথে কাজ করে।


2
cd my_directory && tar -czvf ../my_directory.tar.gz $(ls -A) && cd ..

এইটি আমার পক্ষে কাজ করেছে এবং এতে "লুকানো ফাইলগুলি" নামের একটি মূল ডিরেক্টরিতে সমস্ত ফাইল না রেখেই অন্তর্ভুক্ত রয়েছে "" টমোর জবাব মত :


1
tar.create() {
        local folder="${1}"

        local tar="$(basename "${folder}")".tar.gz

        cd "${folder}" && tar -zcvf "../${tar}" .; cd - &> /dev/null
}

উদাহরণ:

tar.create folder

আপনি স্বাগত জানাই।


1

এটি আমার জন্য কাজ করে কি।

tar -cvf my_dir.tar.gz -C /my_dir/ $(find /my_dir/ -maxdepth 1 -printf '%P ')

আপনি ব্যবহার করতে পারে

tar -cvf my_dir.tar.gz -C /my_dir/ $(find /my_dir/ -mindepth 1 -maxdepth 1 -printf '%P ')

প্রথম কমান্ডে, খোঁজ ফাইল এবং সাব-ডিরেক্টরির একটি তালিকা ফেরৎ my_dir । তবে ডিরেক্টরিটি my_dir নিজেই সেই তালিকায় অন্তর্ভুক্ত রয়েছে। ' -printf পরামিতি সহ সম্পূর্ণ পাথ সরিয়ে ফেলা হবে '।' এবং সমস্ত তবে বিন্যাস স্ট্রিং '% পি' এর printf, পাতার ফাইল এবং সাব-ডিরেক্টরির তালিকায় থাকা একটি অবশেষ my_dir এবং ফলাফলে একটি অগ্রণী স্থান দ্বারা দেখা যায় খোঁজ কমান্ড।

এটি টিআর এর জন্য সমস্যা হবে না তবে আপনি যদি এটি ঠিক করতে চান তবে দ্বিতীয় কমান্ডের মতো -মাইন্ডপথ 1 যুক্ত করুন ।


0

প্যাক্স ব্যবহার করুন।

প্যাক্স হ'ল অবহেলিত প্যাকেজ তবে পুরোপুরি এবং সাধারণ ফ্যাশনে কাজটি করে।

pax -w > mydir.tar mydir

সর্বাধিক ব্যবহারিক এবং কাজটি +1 করে
ব্রেণো সালগাদো

এই কমান্ডটি mydir.tar বিষয়বস্তু সহ তৈরি করে: mydir / file1 mydir / file2, ঠিক কী এড়ানো হবে।
অ্যালেক্স

0

সবচেয়ে সহজ উপায় আমি খুঁজে পেয়েছি:

সিডি মাই_ডির অ্যান্ড অ্যান্ড টার-সিজেভিএফ ../my_dir.tar.gz *


1
এর মধ্যে লুকানো ফাইল অন্তর্ভুক্ত থাকবে না।
অ্যাসিণ্ট

0
# tar all files within and deeper in a given directory
# with no prefixes ( neither <directory>/ nor ./ )
# parameters: <source directory> <target archive file>
function tar_all_in_dir {
    { cd "$1" && find -type f -print0; } \
    | cut --zero-terminated --characters=3- \
    | tar --create --file="$2" --directory="$1" --null --files-from=-
}

স্পেস বা অন্যান্য অস্বাভাবিক অক্ষরের সাথে ফাইলের নাম নিরাপদে পরিচালনা করে। -name '*.sql'অন্তর্ভুক্ত থাকা ফাইলগুলিকে সীমাবদ্ধ করতে আপনি বিকল্প কমান্ডে একটি বা অনুরূপ ফিল্টার যুক্ত করতে পারেন ।


-1
 tar -cvzf  tarlearn.tar.gz --remove-files mytemp/*

যদি ফোল্ডারটি মাইটেম্প হয় তবে আপনি উপরেরটি প্রয়োগ করলে এটি ফোল্ডারে থাকা সমস্ত ফাইল জিপ করে সরিয়ে ফেলবে তবে একা রেখে দেবে

 tar -cvzf  tarlearn.tar.gz --remove-files --exclude='*12_2008*' --no-recursion mytemp/*

আপনি বাদ পড়ার ধরণগুলি দিতে পারেন এবং সাব-ফোল্ডারগুলিতেও সন্ধান না করার জন্য উল্লেখ করতে পারেন


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