دليل Shell To Tran Directory باستثناء بعض الملفات / المجلدات
سؤال
هل هناك قيادة / نص شل بسيط يدعم باستثناء بعض الملفات / المجلدات من أرشفة؟
لدي دليل يحتاج إلى أرشفة مع دليل فرعي له عدد من الملفات الكبيرة جدا لا أحتاج إلى النسخ الاحتياطي.
ليس الحلول:
ال 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
بعد قراءة كل هذه الإجابات الجيدة للحصول على إصدارات مختلفة وحل المشكلة بنفسي، أعتقد هناك تفاصيل صغيرة جدا مهمة للغاية، ونادرة من استخدام جنو / لينكس, ، لا يشدد ذلك على ما يكفي ويستحق أكثر من التعليقات.
لذلك لن أحاول الإجابة على سؤال كل حالة، ولكن بدلا من ذلك، حاول التسجيل أين تبدو عندما لا تعمل الأمور.
من المهم جدا أن نلاحظ:
- أمر "خيارات" الأمر: ليس هو نفسه وضع - exclude من قبل خيار الملف والدلائل للنسخ الاحتياطي. هذا غير متوقع بالنسبة لي على الأقل، لأنه في تجربتي، في أوامر GNU / Linux، عادة ما لا يهم ترتيب الخيارات.
- تتوقع إصدارات القطراء المختلفة هذه الخيارات بترتيب مختلف: على سبيل المثال، @ أندرو الإجابة يشير إلى أنه في GNU TAR V 1.26 و 1.28، يأتي الاستباري الماضي، بينما في حالتي، مع القطران جنو 1.29، فهو الاتجاه الآخر.
- المتخلص زائدة المسألة: على الأقل في جنو القطران 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 "إدخال واحد من القائمة". الخط أحرف الهروب من "علامات".