1

Следующая команда tar исключит все точечные файлы и точечные каталоги.

tar -cvzf /media/bjackfly/bkup/bkup.gz --exclude '.*' --one-file-system /home/bjackfly

В моем случае я хочу, чтобы файлы точек создавались в домашнем каталоге (.vimrc , .bashrc) и т.д., Но не в каталогах точек /.config /.cache /.eclipse и т.д.

Любой гуру Linux с командой для этого, или мне нужно запустить поиск в tar или сделать две разные команды tar, что не идеально? Один для точечных файлов в домашнем каталоге и один для всего остального?

6 ответов6

2

Чтобы сжать точечные файлы в вашем домашнем каталоге:

$ cd
$ find . -maxdepth 1 -type f -name ".?*" -exec tar czfv dotfiles.tgz {} +

Если вы хотите включить каталоги:

$ find . -maxdepth 1 -name ".?*" -exec tar czfv dotfiles.tgz {} +

? необязателен в первой команде, но не во второй, в противном случае find будет содержать '.' каталог.

(вдохновение взято отсюда.)

1

Использование логических операторов find -and и -or для выбора всех файлов и каталогов, которые не начинаются с '.«:

tar -cvzf /media/bjackfly/bkup/bkup.gz --one-file-system $(find /home/bjackfly -type f -or -type d -and -not -name '.*' )

Редактировать slhck прокомментировал вышеупомянутое решение не обрабатывает имена файлов, содержащие пробелы. Это одно из решений, может быть, кто-то знает более элегантную технику?

find . -type f -or -type d -and -not -name '.*' >/tmp/tar.$$
tar -cvzf /media/bjackfly/bkup/bkup.gz --one-file-system /home/bjackfly -T /tmp/tar.$$
rm /tmp/tar.$$
1

Я не знаю, как сделать это за один раз, но вы можете запустить свою команду и создать файл tar, а затем использовать команду find чтобы добавить недостающее. каталоги.

Что-то вроде $ find -type d -regex '\..+' -exec tar -r {} /media/bjackfly/bkup/bkup.gz \;

Я не проверял эту команду, так как я сижу на машине с Windows и не имею доступа к оболочке, но вы должны быть в состоянии сделать это с помощью этой команды или ее отклонений. Я не уверен, что эта команда поднимет . и .. каталоги к.

Приветствия.

0

1.
find ./target-dir -type d -name '.?*' -prune -o -print0 | tar --null --no-recursion -cvzf backup.tar.gz -T -

ИЛИ ЖЕ

2.
find ./target-dir -type d -name '.?*' -prune -o -print0 -exec tar --null --no-recursion -cvzf backup.tar.gz -T {} +

0

Таким образом, настоящий трюк заключается в том, чтобы создать обычный файл .tar, а затем использовать находку, переданную по каналу в другой файл tar, с помощью параметра -u, чтобы добавить или обновить .tar, а затем просто сжать его. Спасибо Моггет, у которого была основная идея.

#!/bin/bash
BKUPDIR="/media/bjackfly/backupDisk/bkup"
BKUPFILE=$(/bin/date +"%Y%m%d").bkup
SRCDIR=/home/bjackfly


tar -cvf "$BKUPDIR/${BKUPFILE}.tar" --exclude '.*'  --one-file-system "$SRCDIR"
find $SRCDIR -maxdepth 1 -mindepth 1 -type f -name '.*'  ! \( -name .Xauthority.* \) | tar -uvf "$BKUPDIR/$BKUPFILE.tar" -T -
gzip "$BKUPDIR/$BKUPFILE.tar"
0

Нет не то Если вы хотите сделать резервную копию всех файлов в плоской структуре каталогов без рекурсии, используйте:

tar cvf backupfile.tar -C /specify/dir --no-recursion '.*'

к сожалению, это резервное копирование точечных файлов с точечными каталогами. Хорошая новость заключается в том, что содержимое каталога не будет сохранено.

В противном случае, если в именах файлов нет новых символов строки, вы можете использовать:

cd /some/dir
find ./ -minlevel 1 -maxlevel 1 -type f -name '.*'|tar cvf backupfile.tar -T - --no-recursion

ищите вариант -T. с аргументом '-' это получить список файлов из его стандартного ввода. список генерируется командой find. Этот подход лучше, потому что вы не ограничены максимальной длиной команды, как примеры, приведенные другими, например tar .... что-то $(find) или find ... | xargs ... tar ..something ... {}, который помещает полный список файлов в качестве аргументов команды tar. это может переполнить ограничение размера команды.

Опция --no-recursion в этом случае только для безопасности. эта причина, когда tar получает какой-то каталог, tar не подходит для этой структуры каталогов. это очень полезно в сочетании с поиском.

При таком подходе вы можете запустить (как сухой, без создания резервной копии) команду find, и вы увидите, какие файлы для этого нужны.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .