دليل Shell To Tran Directory باستثناء بعض الملفات / المجلدات

StackOverflow https://stackoverflow.com/questions/984204

  •  13-09-2019
  •  | 
  •  

سؤال

هل هناك قيادة / نص شل بسيط يدعم باستثناء بعض الملفات / المجلدات من أرشفة؟

لدي دليل يحتاج إلى أرشفة مع دليل فرعي له عدد من الملفات الكبيرة جدا لا أحتاج إلى النسخ الاحتياطي.

ليس الحلول:

ال tar --exclude=PATTERN يطابق الأمر نمط معين ويستبعد تلك الملفات، لكنني أحتاج إلى تجاهل ملفات ومجلدات محددة (مسار الملف الكامل)، قد يتم استبعاد الملفات الصحيحة بشكل خلاف ذلك.

يمكنني أيضا استخدام الأمر "البحث" لإنشاء قائمة بالملفات واستبعاد تلك التي لا أريد أرشفة وتمرير القائمة إلى القطران، لكن هذا يعمل فقط مع كمية صغيرة من الملفات. لدي عشرات الآلاف.

لقد بدأت أعتقد أن الحل الوحيد هو إنشاء ملف مع قائمة الملفات / المجلدات المراد استبعادها، ثم استخدم RSYNC مع --exclude-from=file لنسخ جميع الملفات إلى دليل TMP، ثم استخدم القطران لأرشفة هذا الدليل.

هل يمكن لأي شخص أن يفكر في حل أفضل / أكثر كفاءة؟

تعديل: تشارلز ماالحل يعمل بشكل جيد. جوتشا الكبير هو أن --exclude='./folder' يجب يكون في بداية قيادة القطران. الأمر الكامل (القرص المضغوط أولا، لذلك النسخ الاحتياطي بالنسبة لهذا الدليل):

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
هل كانت مفيدة؟

المحلول

يمكنك الحصول على خيارات متعددة الاستبعاد للقطران

$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

وما إلى ذلك سوف تعمل. يصنع بالتأكيد لوضع --exclude قبل البنود المصدر والوجهة.

نصائح أخرى

يمكنك استبعاد الدلائل مع --exclude للقطران.

إذا كنت ترغب في أرشفة كل شيء ما عدا /usr يمكنك استخدام:

tar -zcvf /all.tgz / --exclude=/usr

في حالتك ربما شيء مثل

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir

خيارات محتملة لاستبعاد الملفات / الدلائل من النسخ الاحتياطي باستخدام TAR:

استبعاد الملفات باستخدام أنماط متعددة

tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup

استبعاد الملفات باستخدام ملف استبعاد مليء بقائمة الأنماط

tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup

استبعاد الملفات باستخدام العلامات عن طريق وضع ملف العلامة في أي دليل يجب أن تخطي

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup

السؤال القديم مع العديد من الإجابات، ولكن وجدت أن لا شيء واضح تماما بما فيه الكفاية بالنسبة لي، لذلك أود أن أضيف جربتي.

إذا كان لديك الهيكل التالي

/home/ftp/mysite/

مع ملف / مجلدات التالية

/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3

لذلك، تريد إنشاء ملف قطران يحتوي على كل من الداخل / الصفحة الرئيسية / FTP / mysite (لنقل الموقع إلى خادم جديد)، ولكن file3 هو مجرد غير المرغوب فيه، وكل شيء في folder3 ليس هناك حاجة أيضا، لذلك سنتخطي هذين.

نستخدم التنسيق

tar -czvf <name of tar file> <what to tar> <any excludes>

حيث c = create، z = zip، و v = v = verbose (يمكنك رؤية الملفات كما يتم إدخالها، مفيدة للتأكد من عدم إضافة أي من الملفات التي تستبعدها). و f = الملف.

لذلك، سيظهر الأمر هكذا

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

لاحظ أن الملفات / المجلدات المستثناة نسبيا إلى جذر القطران الخاص بك (لقد جربت المسار الكامل هنا بالنسبة إلى / ولكن لا يمكنني جعل هذا العمل).

آمل أن يساعد هذا شخص ما (وأنا في المرة القادمة أنا جوجل)

يمكنك استخدام "ترميز النمل" القياسي لاستبعاد الدلائل النسبية.
هذا يعمل بالنسبة لي ويستبعد أي أدلة. جيت أو node_module.

tar -cvf myFile.tar --exclude=**/.git/* --exclude=**/node_modules/*  -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt

MyInputFile.txt يحتوي على:

/ dev2 / java
/ dev2 / javascript

لقد واجهت ذلك، على الأقل مع cygwin. نسخة من القطران أستخدمها ("cygwin_nt-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 I686 Cygwin" على جهاز Windows XP Home Edition SP3)، ترتيب الخيارات مهم.

في حين أن هذا البناء يعمل بالنسبة لي:

tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir

هذا لم تفعل ذلك الشغل:

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir

هذا، في حين tar --help يكشف ما يلي:

tar [OPTION...] [FILE]

لذلك، يجب أن يعمل الأمر الثاني أيضا، ولكن يبدو أنه لا يبدو أنه هو الحال ...

أفضل RGDS،

هذه القائمة باستثناء نمط مع لاحقة اسم الملف مثل PNG أو MP3 وكذلك أسماء الدليل مثل .git و node_modules

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}

لقد وجدت هذا في مكان آخر، لذلك لن آخذ الائتمان، لكنه يعمل بشكل أفضل من أي حلول أعلاه لقضايا Mac الخاصة بي (على الرغم من أن هذا مغلق):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>

بالنسبة لأولئك الذين لديهم مشكلات معه، فإن بعض إصدارات القطرين ستعمل فقط بشكل صحيح دون "./" في القيمة الاستبعاد.

Tar --version

القطران (القطران جنو) 1.27.1

بناء جملة الأمر الذي يعمل:

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo

هذه لن تعمل:

$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=./acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='./acme/foo'
$ tar --exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='./acme/foo' -czvf ../allfiles-butsome.tar.gz *
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=/full/path/acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='/full/path/acme/foo'
$ tar --exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='/full/path/acme/foo' -czvf ../allfiles-butsome.tar.gz *

لماك OSX اضطررت للقيام به

tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar

لاحظ ال -f بعد --exclude=

أوافق على - exclude العلم هو النهج الصحيح.

$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'

كلمة من. تحذير للحصول على تأثير جانبي لم أجد واضحا على الفور: يستقبل استبعاد "Filea" في هذا المثال عن "FileA" متكرر!

مثال: دليل مع دليل فرعي واحد يحتوي على ملف من نفس الاسم (data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • إذا كنت تستخدم --exclude='data.txt' الأرشيف لن يحتوي أيضاً ملف data.txt. يمكن أن يسبب ذلك نتائج غير متوقعة إذا أرشفة مكتبات الطرف الثالث، مثل دليل Node_Modules.

  • لتجنب هذه المشكلة تأكد من إعطاء المسار بأكمله، مثل --exclude='./dirA/data.txt'

لتجنب ممكن 'xargs: Argument list too long' الأخطاء بسبب استخدام find ... | xargs ... عند معالجة عشرات الآلاف من الملفات، يمكنك أنبوب إخراج find مباشرة الى tar استخدام find ... -print0 | tar --null ....

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -

بعد قراءة هذا الموضوع، قمت باختبار القليل في RHEL 5 وهنا نتائجي ل Tarring Up دليل ABC:

سيستبعد هذا خطأ الدلائل وسجلات وجميع الملفات ضمن الدلائل:

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'

إضافة بطاقة البدل بعد استبعاد الدليل المستبعدين الملفات ولكن الحفاظ على الدلائل:

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'

استخدم الأمر "البحث" بالتزامن مع خيار Tar Append (-r). بهذه الطريقة يمكنك إضافة ملفات إلى قطران موجود في خطوة واحدة، بدلا من حل PASS (إنشاء قائمة بالملفات، قم بإنشاء القطران).

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;

يمكنك أيضا استخدام أحد خيارات "- exclude-tag" اعتمادا على احتياجاتك:

  • - exclude-tag = ملف
  • - exclude-tag-all = ملف
  • - exclude-tag-usd = ملف

سيتم استبعاد المجلد الذي يستضيف الملف المحدد.

يمكنك استخدام CPIO (1) لإنشاء ملفات القطران. يأخذ CPIO الملفات إلى أرشفة Stdin، لذلك إذا كنت قد اكتشفت بالفعل أمر البحث الذي تريد استخدامه لتحديد الملفات التي تقوم بها الأرشيف، أنابيبها في CPIO لإنشاء ملف القطران:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz

GNU TAR V 1.26 يحتاج -Exclude يحتاج إلى المجيء بعد وسيطات ملفات أرشفة ودليل النسخ الاحتياطي، يجب أن لا يكون لها خطوط مائلة رائدة أو زائدة، وتفضل أي اقتباسات (واحدة أو مزدوجة). بالنسبة إلى الدليل الأصلي ليتم دعمها، فهي:

tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude

بعد قراءة كل هذه الإجابات الجيدة للحصول على إصدارات مختلفة وحل المشكلة بنفسي، أعتقد هناك تفاصيل صغيرة جدا مهمة للغاية، ونادرة من استخدام جنو / لينكس, ، لا يشدد ذلك على ما يكفي ويستحق أكثر من التعليقات.

لذلك لن أحاول الإجابة على سؤال كل حالة، ولكن بدلا من ذلك، حاول التسجيل أين تبدو عندما لا تعمل الأمور.

من المهم جدا أن نلاحظ:

  1. أمر "خيارات" الأمر: ليس هو نفسه وضع - exclude من قبل خيار الملف والدلائل للنسخ الاحتياطي. هذا غير متوقع بالنسبة لي على الأقل، لأنه في تجربتي، في أوامر GNU / Linux، عادة ما لا يهم ترتيب الخيارات.
  2. تتوقع إصدارات القطراء المختلفة هذه الخيارات بترتيب مختلف: على سبيل المثال، @ أندرو الإجابة يشير إلى أنه في GNU TAR V 1.26 و 1.28، يأتي الاستباري الماضي، بينما في حالتي، مع القطران جنو 1.29، فهو الاتجاه الآخر.
  3. المتخلص زائدة المسألة: على الأقل في جنو القطران 1.29، لا ينبغي أن يكون أي أي.

في حالتي، بالنسبة إلى جنو القطران 1.29 على تمتد دبيان، كان الأمر الذي عمل كان

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

لا تهم الاقتباسات، عملت معها أو بدونها.

آمل أن يكون هذا مفيدا لشخص ما.

أفضل رهان هو استخدام البحث مع القطران، عبر Xargs (للتعامل مع عدد كبير من الحجج). علي سبيل المثال:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

يشير -x إلى ملف يحتوي على قائمة بأسماء الملفات التي يجب استبعادها من النسخة الاحتياطية. على سبيل المثال، يمكنك تحديد * ~ في هذا الملف لعدم تضمين أي أسماء الملفات التي تنتهي مع ~ في النسخة الاحتياطية.

إمكانية إجابة زائدة عن الحاجة ولكن منذ أن وجدت أنها مفيدة، فهي:

في حين أن الجذر FreeBSD (أي استخدام CSH) أردت نسخ نظام ملفات الجذر بالكامل إلى / mnt ولكن بدون / USR و (من الواضح) / MNT. هذا هو ما عملت (أنا في /):

tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)

وجهة نظري كلها هي أنه كان من الضروري (عن طريق وضع ./) ل حدد إلى القطران أن الدلائل المستبعدة حيث يتم نسخ جزء من الدليل الكبير.

بلدي € 0.02.

لم يكن لدي حظ في الحصول على القطران لاستبعاد الدليل الفرعي 5 غيغابايت بعدة مستويات عميقة. في النهاية، أنا فقط استخدمت أمر unix zip. عملت أسهل كثيرا بالنسبة لي.

لذلك لهذا المثال بالذات من المشاركة الأصلية
(TAR - exclude = '. / مجلد' - exclude = '. / تحميل / folder2' -zcvf / backup/filename.tgz/filename.tgz.)

ما يعادل سيكون:

Zip -r / backup/filename.zip. -x تحميل / مجلد / ** * تحميل / folder2 / ** *

(ملاحظة: هنا هو المنشور الذي استخدمته في الأصل الذي ساعدني https://superuser.com/Questions/312301/unix-zip-directory-but-excluded-subdicationsubectories-and-everything-within-t.)

تحقق من ذلك

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName

يجب أن يقوم البرنامج النصي باش التالي بالخدعة. يستخدم الجواب المعطى هنا من ماركوس سوندمان.

#!/bin/bash

echo -n "Please enter the name of the tar file you wish to create with out extension "
read nam

echo -n "Please enter the path to the directories to tar "
read pathin

echo tar -czvf $nam.tar.gz
excludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`
echo $pathin

echo tar -czvf $nam.tar.gz $excludes $pathin

سيؤدي ذلك إلى طباعة الأمر الذي تحتاجه ويمكنك فقط نسخها ولصقها. ربما تكون هناك طريقة أكثر أناقة لتزويدها مباشرة إلى سطر الأوامر.

فقط تغيير * .cc لأي امتداد مشترك آخر أو اسم الملف أو Regex الذي تريد استبعاده وهذا يجب أن يعمل.

تعديل

فقط لإضافة تفسير صغير؛ يمكنك العثور على إنشاء قائمة بالملفات المطابقة Regex المختارة (في هذه الحالة * .cc). يتم تمرير هذه القائمة عبر Xargs إلى أمر الصدى. هذه المطبوعات - exclude "إدخال واحد من القائمة". الخط أحرف الهروب من "علامات".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top