GNU/Linux >> Linux Esercitazione >  >> Linux

Copia ricorsiva di file nascosti - Linux

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:

  • -H causerà find non 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 1 interromperà find dalla discesa ricorsiva in tutte le directory il cui nome inizia con un punto. Non ne abbiamo bisogno per la ricorsione, cp lo farà per noi, abbiamo solo bisogno dei nomi a questo livello.
  • -name '.*' dice find che vogliamo tutti i nomi che iniziano con un punto. Questo non funzionerà correttamente se la variabile d'ambiente POSIXLY_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 l sono tre condizioni con un o tra loro. -type d corrisponde alle directory, -type f corrisponde a file regolari e -type l corrisponde 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 -o subito dietro, ovviamente.)
  • -exec ..... \; dice a find per 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.


Linux
  1. Nascondi i file nascosti di Linux in Windows

  2. Conteggio ricorsivo dei file in una directory Linux

  3. Come eseguire il chmod e il chown dei file nascosti in Linux?

  4. usare SED in modo ricorsivo in Linux?

  5. Copia di utenti e password Linux su un nuovo server

Comando Rm in Linux

Come modificare ricorsivamente le autorizzazioni dei file in Linux

Come trovare ed elencare in modo ricorsivo i file per data in Linux

Rsync Mostra la barra di avanzamento durante la copia di file in Linux

Come elencare i file in modo ricorsivo in Linux

Come mostrare file nascosti su Linux