Soluzione 1:
Quasi ogni volta questo può essere risolto solo con:
cp -R .[a-zA-Z0-9]* directory
È abbastanza insolito avere un file nascosto che non inizia con uno di quei caratteri.
Sono disponibili altri pattern match (.??* , .[^.]* ) - vedi i commenti
Soluzione 2:
Il mio preferito per spostare le cartelle in generale è stato:
tar cvf - . | (cd /dest/dir; tar xvf -)
che esegue il tar della directory corrente su stdout, quindi la reindirizza a una subshell che prima fa il cd nella directory di destinazione prima di decomprimere stdin. Semplice, diretto, estensibile:considera cosa succede quando sostituisci () con un ssh su un'altra macchina. O per rispondere alla tua domanda potresti fare:
tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
Soluzione 3:
Potresti usare rsync .
rsync -a ./ /some/other/directory/
che copierà il contenuto della directory corrente (inclusi i file punto, ma non includendo .. )
Soluzione 4:
Ti imploro, allontanati dalla semplice espansione della shell sul cp riga di comando - l'espansione della shell ha tutti i tipi di ahem Casi limite "interessanti" (ricorsività indesiderata causata da . e .., spazi, elementi non stampabili, collegamenti fisici, collegamenti simbolici e così via.) Usa find invece (si trova nel formato findutils pacchetto, nel caso in cui non lo avessi installato - il che sarebbe strano, tutte le distribuzioni lo installano per impostazione predefinita):
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
Spiegazione passo passo:
-Hcauseràfindnon seguire i collegamenti simbolici (a meno che il nome effettivo della directory di primo livello che gli hai dato sia un collegamento simbolico; che seguirà.)/path/to/toplevel/dir/è, ovviamente, dovrebbe essere sostituito da te con il percorso della directory che ospita i file delle impostazioni e le directory di cui desideri eseguire il backup.-maxdepth 1interromperàfinddalla discesa ricorsiva in tutte le directory il cui nome inizia con un punto. Non ne abbiamo bisogno per la ricorsione,cplo farà per noi, abbiamo solo bisogno dei nomi a questo livello.-name '.*'dicefindche vogliamo tutti i nomi che iniziano con un punto. Questo non funzionerà correttamente se la variabile d'ambientePOSIXLY_CORRECTè impostato, ma raramente (se non mai) lo è. Questa è la prima condizione di corrispondenza che abbiamo specificato finora.a \( ....... \)è un e seguito da una condizione più complessa tra parentesi (ho usato ..... per sostituirla, è spiegato di seguito.) Dobbiamo evitare le parentesi poiché altrimenti sarebbero (erroneamente) interpretate dalla shell, quindi la barra rovesciata di fronte a loro,-type d -o -type f -o -type lsono tre condizioni con un o tra loro.-type dcorrisponde alle directory,-type fcorrisponde a file regolari e-type lcorrisponde ai collegamenti simbolici. Puoi selezionare ciò che desideri, ad esempio, se non desideri eseguire il backup delle directory delle impostazioni, ometti-type d(e il-osubito dietro, ovviamente.)-exec ..... \;dice afindper eseguire un comando ogni volta che si incontra una corrispondenza. La fine del comando è contrassegnata da un punto e virgola, che ancora una volta dobbiamo evitare con una barra rovesciata per evitare l'interpretazione della shell. All'interno di quella riga di comando, devi usare{}dove vuoi che finisca il nome della corrispondenza attualmente incontrata. Poiché le shell potrebbero anche interpretare erroneamente le parentesi graffe, dovresti inserirle tra apostrofi, come in'{}'. Il comando che vogliamo eseguire in questo caso ècp -a '{}' /path/to/destination/dir/(-a significa archivio, che ricorre nelle sottodirectory, copia i collegamenti simbolici come collegamenti e conserva i permessi e gli attributi estesi, e/path/to/destination/dir/è ovviamente il nome della directory di destinazione - sostituiscilo.)
Quindi, in parole povere, questo find riga di comando dice questo:
Inizia da /path/to/toplevel/dir/. Non scendere in alcuna sottodirectory. Trova tutte le directory, i file e i collegamenti simbolici il cui nome inizia con un punto. Per ognuno di quelli che hai trovato, copialo in /path/to/destination/dir/ preservando la natura, i permessi e gli attributi estesi.
Soluzione 5:
Ho sempre usato .??* per trovare i file nascosti senza ottenere "." e "..". Potrebbe mancare ".a" o qualcosa del genere, ma non ne ho mai uno.