2009-10-27 19:46:06 +0000 2009-10-27 19:46:06 +0000
423
423

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

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

Requisiti:

  • Includere file e directory nascoste.
  • Essere un unico 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 unico comando senza il pattern matching? Quale flag devo usare?

Risposte (14)

492
492
492
2011-12-12 22:00:01 +0000

Diciamo che avete creato la nuova cartella (o ne state per creare una) e volete copiarvi i file dopo la creazione della cartella

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

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

281
281
281
2009-10-27 19:55:27 +0000

Non specificare i file:

cp -r /etc/skel /home/user

(Si noti che /home/user non deve esistere già, altrimenti creerà /home/user/skel).

95
95
95
2015-09-08 21:50:45 +0000

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

cp -rT /etc/skel /home/user

Questo copierà il contenuto di /etc/skel in /home/user (inclusi i file nascosti), creando la cartella /home/user se non esiste; tuttavia l'opzione -T impedisce che il contenuto di /etc/skel venga copiato in una nuova cartella /home/user/skel se la cartella /home/user esiste.

68
68
68
2013-02-06 01:14:47 +0000

bash ha di per sé una buona soluzione, ha un shell option, si può cp, mv, bash e 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)

Sopra la soluzione è standard di &007

** NOTA:**

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set
29
29
29
2014-02-20 13:18:25 +0000

Utilizzare rsync:

rsync -rtv source_folder/ destination_folder/

7
7
7
2014-08-28 17:46:19 +0000

rsync è buono, ma un'altra scelta:

cp -a src/ dst/

Dalla guida principale:

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

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

   -R, -r, --recursive
          copy directories recursively
5
5
5
2018-06-06 16:13:41 +0000

Il modo più semplice è:

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

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

Se non si vuole usare l'espressione sopra indicata, allora si può usare la proprietà cp, che è la possibilità di specificare più fonti per una cartella di destinazione:

&001

4
4
4
2016-01-17 17:32:26 +0000

È possibile utilizzare rsync.

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

È anche possibile copiare su ssh

-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.

Ci sono varie bandiere che si possono utilizzare: -a, –archivio # archivio (-rlptgoD)

&001 &001 Rsync man page

4
4
4
2013-05-16 08:38:46 +0000

Se la vostra directory di origine e di destinazione hanno lo stesso nome, anche se la directory di destinazione esiste, potete semplicemente digitare:

cp -R /etc/skel /home/

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

Alla fine, potete copiare la directory e rinominarla in una singola riga :

cp -R /etc/skel /home/ && mv /home/skel /home/user
3
3
3
2015-07-24 13:34:27 +0000

Sono venuto qui con Googled per trovare una soluzione allo stesso problema, poi mi sono reso conto che è facile da trovare. Il vantaggio non dipende dal guscio, o da speciali utility che non possono essere installate.

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

Ho provato il trucco con trailing slash, ma non ha funzionato per me.

2
2
2
2018-01-30 20:42:49 +0000

La mia soluzione per questo problema quando devo copiare tutti i file (inclusi i file .) in una directory di destinazione contenendo i permessi è: (sovrascrivere se già esiste)

yes | cp -rvp /source/directory /destination/directory/
``` &001 




`yes` è per sovrascrivere automaticamente i file di destinazione, `r` ricorsivo, `v` verboso, `p` mantenere i permessi. 

Si noti che il **percorso sorgente non termina con un `/`** (così tutti i file/cartella e i file . vengono copiati) 

**Directory di destinazione termina con `/`** poiché stiamo mettendo il contenuto della cartella sorgente a destinazione nel suo insieme.
2
2
2
2015-05-12 20:00:58 +0000

Si noti che c'è un trucco a riga di comando (funziona almeno in sh, bash e ksh): Basta inserire un suffisso alla directory from con una barra. Questo verserà il contenuto della directory from nella directory to (ironia della sorte, avevo imparato questo trucco per la prima volta quando ho usato 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
1
1
1
2019-02-13 10:18:49 +0000

Ho visto che il cp non sempre copia i file nascosti e se volete un comando che sembra funzionare su tutti i dialetti linux/unix dovreste provare ad usare:

cd /etc/skel
find | cpio -pdumv /home/user
-2
-2
-2
2016-12-14 21:57:06 +0000

A partire da almeno K3b 2.0.3, c'è una casella di domanda che si apre quando la directory viene aggiunta al progetto, che chiede se si desidera includere i file nascosti … c'è anche una domanda che si apre per chiedere di includere i link. Bella roba!