È possibile utilizzare questo comando per eseguire il backup di tutti i dotfile ( .<something>
) nella $HOME
directory:
$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +
regex usando solo tar?
metodo n. 1
Ho studiato un po 'questo e sono risultato vuoto. Il fattore limitante sarebbe che quando tar
si esegue si esclude, la barra finale ( /
) che si presenta con le directory non fa parte dell'equazione quando tar sta eseguendo la sua corrispondenza del modello.
Ecco un esempio:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory
Questa variante include un'esclusione di .*/
e puoi vedere con l'interruttore dettagliato attivato su tar -v
, che queste directory stanno attraversando quell'esclusione.
metodo n. 2
Ho pensato che forse gli interruttori --no-wildcards-match-slash
o --wildcards-match-slash
avrebbero rilassato l'avidità del .*/
ma questo non ha avuto alcun effetto.
Eliminare la barra dall'esclusione , .*
non era neanche un'opzione poiché ciò avrebbe detto tar
di escludere tutti i dotfile e dotdirectories:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$
metodo # 3 (Brutto!)
Quindi l'unica altra alternativa che posso concepire è quella di fornire un elenco di file tar
. Qualcosa come questo:
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory
Questo approccio ha problemi se il numero di file supera la quantità massima di spazio per passare argomenti a un comando sarebbe un problema evidente. L'altro è che è brutto e troppo complesso.
quindi cosa abbiamo imparato?
Non sembra esserci un modo semplice ed elegante per realizzare questo usando tar
espressioni regolari. Per quanto riguarda il commento di @ Terdon, find ... | tar ...
è davvero il modo più appropriato per farlo.