Come copiare con cp per includere file nascosti e directory nascoste e il loro contenuto?


392

Come posso fare assolutamentecp -r copiare tutti i file e le directory in una directory

Requisiti:

  • Includi file nascosti e directory nascoste.
  • Essere un singolo comando con un flag per includere quanto sopra.
  • Non è necessario fare affidamento sul pattern matching.

Il mio brutto, ma funzionante, hack è:

cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user

Come posso fare tutto questo in un comando senza la corrispondenza del modello? Quale bandiera devo usare?


1
Più risposte qui, anche se non sembrano così buone; serverfault.com/questions/3154/…
Roel Van de Paar

Per favore, Eleven81, considera di cambiare la risposta accettata a quella data da @bruno pereira, perché evita di creare una nuova cartella. In caso contrario, lascia che questo commento sia un avvertimento per i nuovi lettori di controllare anche l'altra risposta (più votata). Tx.
Dr Beco,

Risposte:


265

Non specificare i file:

cp -r /etc/skel /home/user

(Nota che /home/usernon deve esistere già, altrimenti verrà creato /home/user/skel.)


61
E 'possibile usare qualcosa di simile se /home/user/skel non esiste?
bradley.ayers,

@ bradley.ayers Penso che si possa copiare in una sottodirectory temporanea per poi spostarli al livello superiore (poiché lo spostamento nella stessa unità è veloce). Meno che ideale, ma più breve di altre soluzioni per me.
Halil Özgür

7
@ bradley.ayers La risposta di Bruno in basso risponde alla tua domanda
Mark

1
Questa soluzione non ha funzionato per me. Non ha copiato i file nascosti. Sto usando CentOS versione 6.5. @ La soluzione di Bruno ha funzionato.
Technext,

2
Sotto ubuntu / debian questo posiziona la directory 'skel' all'interno della directory target e non i file ricorrenti all'interno di skel. Utilizzare -T(nessun bersaglio) come di seguito per un uso corretto. ( -rTper ricorsivo)
bshea,

468

Supponiamo che tu abbia creato la nuova cartella (o ne creerai una) e desideri copiarvi i file dopo aver creato la cartella

mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>

Questo copierà tutti i file / cartelle ricorsivamente da /etc/skeldentro alla cartella già esistente creata sulla prima riga.


5
Se non ho sbagliato, questo non ha copiato i file nascosti / punti.
Halil Özgür

34
Funziona bene per me. Nota che "." è fondamentale per farlo funzionare.
Segna il

12
Funziona, ma perché? Non è possibile trovare un riferimento a questo nel manuale.
Julien Palard,

5
Penso che funzioni perché normalmente, questo creerebbe una nuova cartella con il nome dell'ultima cartella nel primo argomento. Tuttavia, dal momento che quel nome è ., questo comportamento richiederebbe di creare una directory già esistente, quindi salta semplicemente quel passaggio.
Zenexer,

28
@Technext Il globbing predefinito in bash non include i nomi di file che iniziano con a ., per cambiare la necessità di utilizzare il shopt -s dotglobcomando prima di poter includere quei file. Quindi *, per impostazione predefinita, stai chiedendo di copiare tutti i file in modo ricorsivo da questa directory che può essere espansa usando *(che non include i file nascosti per impostazione predefinita). Mentre dall'altra parte .stai usando cp per copiare ricorsivamente tutto da "questa directory".
Bruno Pereira,

80

Il modo corretto per farlo è utilizzare l' -T (--no-target-directory)opzione e copiare ricorsivamente le cartelle (senza barre, asterischi, ecc.), Ovvero:

cp -rT /etc/skel /home/user

Questo copierà il contenuto di /etc/skela /home/user(inclusi i file nascosti), la creazione della cartella /home/user, se non esiste; tuttavia l' -Topzione impedisce che il contenuto di /etc/skelvenga copiato in una nuova cartella /home/user/skelse la cartella /home/useresiste.


3
Risposta corretta. +1
bshea,

questa era davvero la risposta giusta
Gaetan,

questa è la MIGLIORE risposta del gruppo; è l'unico che risolve il problema senza complicarlo
ZaxLofful,

funziona esattamente come previsto
Chetabahana

Lo adoro quando usi la bandiera cmd corretta per un caso.
Tran Triet,

66

bashdi per sé ha una buona soluzione, ha un shell option, Puoi cp, mve così via .:

shopt -s dotglob # for considering dot files (turn on dot files)

e

shopt -u dotglob # for don't considering dot files (turn off dot files)

La soluzione sopra è standard di bash

NOTA:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set

2
È utile quando si desidera copiare solo il contenuto senza creare una nuova directory all'interno della destinazione. Soprattutto quando la directory di destinazione è il punto di montaggio.
Kaszynek,

3
Questa è davvero la risposta migliore e arriva al cuore della domanda ..
Stephen,

7
È setoptper zsh, nel caso qualcuno si stia chiedendo.
Pat

25

Usa rsync:

rsync -rtv source_folder/ destination_folder/


La migliore opzione per me, sebbene io usi --progress per avere più feedback sull'intero processo.
Edenshaw,

5

rsync è buono, ma un'altra scelta:

cp -a src/ dst/

Dall'aiuto principale:

   -a, --archive
          same as -dR --preserve=all

   -d     same as --no-dereference --preserve=links

   -R, -r, --recursive
          copy directories recursively

Ho sempre usato cp -r. Grazie per aver menzionato cp -a
Pinaki Mukherjee il

4

Se la tua directory di origine e di destinazione ha lo stesso nome, anche se esiste una directory di destinazione, puoi semplicemente digitare:

cp -R /etc/skel /home/

Questo copierà la directory / etc / skel in / home /, inclusi i file e le directory nascosti.

Alla fine, è possibile copiare la directory e rinominarla in un'unica riga:

cp -R /etc/skel /home/ && mv /home/skel /home/user

Oppure potresti semplicemente usare cp -r /etc/skel /home/userper rinominare skelin user...
David

Esatto, solo se / home / user non esiste ancora.
Gabriel Hautclocq,

4

Puoi usare rsync.

rsync -aP ./from/dir/ /some/other/directory/

Puoi persino copiare su ssh

rsync -aP ./from/dir/ username@remotehost:/some/other/directory/

Esistono vari flag che è possibile utilizzare: -a, --archive # archive (-rlptgoD)

-r, --recursive
-l, --links      # copy symlinks as links
-p, --perms      # preserve permissions
-t, --times      # preserve times
-g, --group      # preserve group
-o, --owner      # preserve owner
-D               # --devices --specials

--delete         # Delete extra files

You may want to add the -P option to your command.

--partial        # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.

-P               # The -P option is equivalent to --partial --progress.   Its  purpose  is to make it much easier to specify these two options for a long transfer that may be interrupted.

Pagina man di Rsync


4

Il modo più semplice è:

cp -r /etc/skel/{.,}* /home/user

L'espressione {.,}*include tutti i file e le directory (iniziando anche con un punto).

Se non si desidera utilizzare l'espressione sopra, è possibile utilizzare la cpproprietà, che è la capacità di specificare più origini per una cartella di destinazione:

cp -r /etc/skel/* /etc/skel/.* /home/user

1
questo perderebbe file come ..anythingo ...anythingecc. - stackoverflow.com/a/31438355/2351568 contiene la regex corretta per questo problema. || ma comunque usare shopt -s dotglobè ancora la soluzione migliore!
DJCrashdummy,

@DJCrashdummy, sfortunatamente, non capisco perché hai scritto la tua attenzione. Dopotutto, la mia soluzione tiene conto dei casi di cui scrivi. Saluti
simhumileco,

scusa testo sbagliato! - il problema con la tua risposta è che prenderà in considerazione .e ..(che equivale alla cartella corrente e alla sua cartella). || ma comunque la risposta nel link lo spiega ulteriormente e fornisce una soluzione.
DJCrashdummy,

2

Si noti che esiste un trucco da riga di comando (funziona almeno in sh , bash e ksh ): basta aggiungere il suffisso dalla directory from con una barra. Questo riverserà il contenuto della directory from nella directory to (ironicamente, avevo imparato a conoscere questo trucco durante l' utilizzo di rsync ).

Esempio:

/tmp$ mkdir test_dir1
/tmp$ cd test_dir1/
/tmp/test_dir1$ touch aa
/tmp/test_dir1$ touch .bb
/tmp/test_dir1$ cd ..
/tmp$ mkdir test_dir2

/tmp$ cp -r test_dir1/* test_dir2
/tmp$ ls -1a test_dir2
.
..
aa

/tmp$ cp -r test_dir1/ test_dir2
/tmp$ ls -1a test_dir2
.
..
.bb
aa

2

Sono venuto qui con Google per una soluzione allo stesso problema, poi mi sono reso conto che è facile avere a che fare con find. Il vantaggio non dipende dalla shell o da utility speciali che potrebbero non essere installate.

find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;

Ho provato il trucco con la barra finale, ma non ha funzionato per me.


2

La mia soluzione a questo problema quando devo copiare tutti i file (inclusi i .file) in una directory di destinazione mantenendo le autorizzazioni è: (sovrascrivi se esiste già)

yes | cp -rvp /source/directory /destination/directory/

yesserve per sovrascrivere automaticamente i file di destinazione, rricorsivi, vdettagliati, pconservare le autorizzazioni.

Si noti che il percorso di origine non termina con un/ (quindi tutti i file / directory e. File vengono copiati)

La directory di destinazione termina/ quando stiamo posizionando i contenuti della cartella di origine sulla destinazione nel suo insieme.


1

Ho visto che cp non copia sempre i file nascosti e se desideri un comando che sembra funzionare su tutti i dialetti linux / unix, dovresti provare a usare:

cd /etc/skel
find | cpio -pdumv /home/user

-2

Almeno per K3b 2.0.3, c'è una finestra di domanda che si apre quando la directory viene aggiunta al progetto, che chiede se si desidera includere file nascosti ... c'è anche una domanda che si apre per chiedere di includere collegamenti. Bella roba!


"una finestra di domanda che si apre" - per un comando shell (CLI)?
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.