Możesz użyć tego polecenia, aby wykonać kopię zapasową wszystkich plików dotfiles ( .<something>
) w $HOME
katalogu:
$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +
regex używając tylko tar?
metoda nr 1
Badałem to całkiem sporo i wyszedłem pusty. Czynnikiem ograniczającym byłoby to, że podczas tar
wykonywania wyklucza, ukośnik końcowy ( /
), który pojawia się z katalogami, nie jest częścią równania, gdy tar wykonuje dopasowanie wzorca.
Oto przykład:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory
Ten wariant zawiera wykluczenie .*/
i możesz zobaczyć przy włączonym pełnym przełączniku na tar -v
, że te katalogi przechodzą przez to wykluczenie.
metoda nr 2
Myślałem, że może przełączniki --no-wildcards-match-slash
lub --wildcards-match-slash
rozluźnią chciwość tego, .*/
ale to też nie miało żadnego efektu.
Usunięcie ukośnika z wykluczenia również .*
nie było opcją, ponieważ oznaczałoby tar
to wykluczenie wszystkich plików i katalogów dot:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$
metoda nr 3 (brzydka!)
Tak więc jedyną alternatywą, jaką mogę wymyślić, jest podanie listy plików tar
. Coś takiego:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory
Takie podejście ma problemy, jeśli liczba plików przekracza maksymalną ilość miejsca na przekazanie argumentów do polecenia, byłby jednym rażącym problemem. Po drugie, jest brzydka i nadmiernie złożona.
więc czego się nauczyliśmy?
Wydaje się, że nie ma prostego i eleganckiego sposobu na osiągnięcie tego za pomocą tar
wyrażeń regularnych. Jeśli chodzi o komentarz @ terdon, find ... | tar ...
jest to najbardziej odpowiedni sposób na zrobienie tego.