You can use this command to backup all your dotfiles (.<something>
) in your $HOME
directory:
$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +
regex using just tar?
method #1
I researched this quite a bit and came up empty. The limiting factor would be that when tar
is performing it's excludes, the trailing slash (/
) that shows up with directories is not part of the equation when tar is performing its pattern match.
Here's an example:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory
This variant includes an exclude of .*/
and you can see with the verbose switch turned on to tar, -v
, that these directories are passing through that exclude.
method #2
I thought maybe the switches --no-wildcards-match-slash
or --wildcards-match-slash
would relax the greediness of the .*/
but this had no effect either.
Taking the slash out of the exclude, .*
wasn't an option either since that would tell tar
to exclude all the dotfiles and dotdirectories:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$
method #3 (Ugly!)
So the only other alternative I can conceive is to provide a list of files to tar
. Something like this:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory
This approach has issues if the number of files exceeds the maximum amount of space for passing arguments to a command would be one glaring issue. The other is that it's ugly and overly complex.
so what did we learn?
There doesn't appear to be a straight-forward and elegant way to acomplish this using tar
& regular expressions. So as to @terdon's comment, find ... | tar ...
is really the more appropriate way to do this.
I don't see a way to do it from the man page, but you can always filter the results. The following assumes no newlines in your file names:
tar tzf your_archive | awk -F/ '{ if($NF != "") print $NF }'
How it works
By setting the field separator to /
, the last field awk
knows about ($NF
) is either the file name if it's processing a file name or empty if it's processing a directory name (tar
adds a trailing slash to directory names). So, we're basically telling awk
to print the last field if it's not empty.
Best Answer
I think you can do this with the
-C
option.From the tar man page:
This means that you should be able to run
to achieve what you want.