it-swarm-eu.dev

Vieni per quanto riguarda i file nascosti e le directory nascoste e il loro contenuto?

Come posso rendere cp -r copia assolutamente tutto dei file e delle directory in una directory

Requisiti:

  • Includi file nascosti e directory nascoste.
  • Essere un singolo comando con una bandiera 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 bandiera devo usare?

356
eleven81

Non specificare i file:

cp -r /etc/skel /home/user

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

244
Randy Orrison

Diciamo che hai creato la nuova cartella (o ne stai creando una) e vuoi copiare i file su di essa dopo che la cartella è stata creata

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

Questo copierà tutti i file/cartelle in modo ricorsivo da /etc/skel alla cartella già esistente creata sulla prima riga.

445
Bruno Pereira

bash stesso ha una buona soluzione, ha un Shell option, puoi cp, mv 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)

La soluzione di cui sopra è standard di bash

NOTA:

shopt # without argument show status of all Shell options
-u # abbrivation of unset 
-s # abbrivation of set
65
PersianGulf

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

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 i contenuti di /etc/skel vengano copiati in una nuova cartella /home/user/skel se la cartella /home/user esiste.

65
TechnocratiK

Usa rsync:

rsync -rtv source_folder/ destination_folder/

24
user1084282

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, puoi copiare la directory e rinominarla in una singola riga:

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

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
4
Wink Saville

Potresti usare rsync.

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

Puoi anche copiare su ssh

rsync -aP ./from/dir/ [email protected]:/some/other/directory/

Ci sono vari flag che puoi usare: -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

3
RoshP

Il modo più semplice è:

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

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

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

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

Si noti che esiste un trucco da riga di comando (funziona almeno in sh , bash , e ksh ): basta suffisso from directory con una barra. Questo riverserà il contenuto della directory from nella directory to (ironia della sorte, ho dovuto prima conoscere questo trucco quando using 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
Dustin Oprea

Sono venuto qui con Google per una soluzione allo stesso problema, poi ho capito che è facile fare con find. Il vantaggio non dipende da Shell o da utilità speciali che non possono 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
Linus

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

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

yes serve per sovrascrivere automaticamente i file di destinazione, r ricorsiva, v verbose, p mantiene le autorizzazioni.

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

La directory di destinazione termina con /poiché stiamo posizionando il contenuto della cartella di origine sulla destinazione nel suo complesso.

2
Rajneesh Gadge

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

cd /etc/skel
find | cpio -pdumv /home/user
1
Mikael Nyborg