создание архива с помощью tar включая весь 'dotfiles', но, исключая все подкаталоги и/wo структуру каталогов

Можно проверить код состояния mount, и большинство правильно написанных исполняемых файлов, с оболочкой специальный параметр ?.

От man bash:

? Expands to the exit status of the most recently executed foreground pipeline.

После выполнения mount команда, сразу выполнившись echo $? распечатает код состояния от предыдущей команды.

# mount /dev/dvd1 /mnt
  mount: no medium found on /dev/sr0
# echo $?
  32

Не все исполняемые файлы имеют четко определенные коды состояния. Как минимум это должно выйти с успехом (0) или отказом (1) код, но это не всегда имеет место.

Чтобы подробно остановиться (и корректный) на Вашем сценарии в качестве примера, я добавил вложенный if создайте для ясности. Это не единственный способ протестировать код состояния и выполнить действие, но является самым легким читать при изучении.

#!/bin/bash
mount="/myfilesystem"

if grep -qs "$mount" /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."
  mount "$mount"
  if [ $? -eq 0 ]; then
   echo "Mount success!"
  else
   echo "Something went wrong with the mount..."
  fi
fi

Для получения дополнительной информации о "Выходе и Статусе выхода", можно обратиться к Усовершенствованному Руководству по созданию сценариев Bash.

18
19.07.2013, 17:29
4 ответа

Можно использовать эту команду для резервного копирования всего dotfiles (.<something>) в Вашем $HOME каталог:

$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +

regex, использующий просто tar?

метод № 1

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

Вот пример:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory

Этот вариант включает исключение .*/ и Вы видите с подробным переключателем, включенным к tar, -v, то, что эти каталоги проходят, которые исключают.

метод № 2

Я думал, возможно, переключатели --no-wildcards-match-slash или --wildcards-match-slash ослабил бы жадность .*/ но это не имело никакого эффекта также.

Взятие наклонной черты из исключения, .* не была опция ни одним, так как это скажет tar исключить весь dotfiles и dotdirectories:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$

метод № 3 (Ужасный!)

Таким образом, единственная другая альтернатива, которую я могу задумать, должна предоставить список файлов к tar. Что-то вроде этого:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory

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

таким образом, что мы изучали?

Кажется, нет простого и изящного способа выполнить это использование tar И регулярные выражения. Чтобы к комментарию @terdon, find ... | tar ... действительно более соответствующий способ сделать это.

14
27.01.2020, 19:46
  • 1
    я действительно хотел получить его, покончил regex, но я должен был знать, что это не будет работать тот путь :) –  klingt.net 19.07.2013, 18:04
  • 2
    @klingt.net - это должно быть возможно, я смотрю теперь. –  slm♦ 19.07.2013, 18:05
  • 3
    @klingt.net, почему Вы предпочли бы более сложный путь? Используя regex Вы должны будете, вероятно, выйти из ведущей точки и испытаете затруднения при игнорировании . и ... Я уверен, что это возможно, как slm, вероятно, продемонстрирует, но я не вижу, почему это стоило бы. –  terdon♦ 19.07.2013, 18:08
  • 4
    @klingt.net - все, что find команда находит, добираются, передал как аргумент tar. {} говорит, где Вы хотите, чтобы те результаты вошли в соответствие -exec команда. + говорит для добавления как много результатов find как будет соответствовать на командной строке и вызове tar только пару раз, а не каждый раз результат найден. –  slm♦ 19.07.2013, 18:12
  • 5
    @klingt.net - нет способа выполнить это использование regex и tar потому что нет никакого способа изолировать точечные каталоги (.blah/). Tar не использует запаздывающую наклонную черту при выполнении исключения. –  slm♦ 19.07.2013, 18:59

Этот вид управления соответствием файлам является путем вне зоны комфорта tar. Его правила для соответствия файлам ограничены простыми соответствиями по именам.

find один путь, но так как у Вас есть zsh, у Вас есть он легче:

tar -cf "$HOME/$BACKUPFILE" --auto-compress .*(.)

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

Символьные ссылки на регулярные файлы не подобраны. Если Вы изменяетесь на .*(-.), они будут включены, но файл не окажется в архиве, если он не будет также включен. Если Вы хотите заменить символьную ссылку их целями, сделайте это .*(-.:A) — :A добавляет модификатор расширения истории, который разрешает все символьные ссылки на путь, который не использует символьные ссылки.

4
27.01.2020, 19:46

Этот ответ основан на slm's, но я также покажу Вам, как включать начало каталогов .

В точечные файлы на молнии в Вашем корневом каталоге:

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

Включать каталоги:

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

? является дополнительным в первой команде, но не во втором, иначе, find будет включать . (текущий) каталог.

3
27.01.2020, 19:46

а как насчет:

tar -C $HOME -cvzf dotfiles.tgz .
1
27.01.2020, 19:46

Теги

Похожие вопросы