Получите действия для команды программно

Можно использовать эту команду для резервного копирования всего 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 ... действительно более соответствующий способ сделать это.

5
11.04.2014, 12:29
2 ответа
[1133391]Эта возможность выполняется с помощью так называемого Bash Completion. Файлы, которые его возвращают, хранятся в файле [1133898]/etc/bash_completion.d[1133899], при этом каждая команда имеет свой собственный файл. Поэтому в случае [1133900]git[1133901]:[12215]Если вы посмотрите на этот файл, то заметите, что он перегружает ваше окружение дополнительными функциями. Одна из них, в частности, эта:[12216]Когда вы её запустите, то получите список подкоманд. [12217]Зная, что это просто функции в вашем окружении, вы можете:[12218]Получить список всех функций завершения Bash, которые дают различную информацию о [1133902]git[1133903] команде.[1133400].
7
27.01.2020, 20:35

То, что вы здесь видите, называется программируемым завершением . В системах на основе Debian / Ubunutu пакеты часто устанавливают файл в / usr / share / bash-completions , который обеспечивает программируемое завершение команды. В других дистрибутивах можно использовать каталог /etc/bash_completion.d (это расположение не рекомендуется в Debian / Ubuntu, но некоторые пакеты все еще используют его). Для меня файл, содержащий функции, которые генерируют завершение для git , - это / usr / share / bash-completions / .

Основной процесс состоит в том, что определяются функции, которые генерируют контент для массива оболочки COMPREPLY , а затем они регистрируются для определенных команд с использованием встроенной оболочки complete .

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

2
27.01.2020, 20:35

Теги

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