Вы можете использовать эту команду для резервного копирования всех ваших dotfiles ( .<something>
) в вашем $HOME
каталоге:
$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +
регулярное выражение, используя только 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
указывало бы на исключение всех файлов точек и каталогов точек:
$ 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 ...
это действительно более подходящий способ сделать это.