it-swarm-eu.dev

Copia il contenuto della directory usando il comando 'cp'

Come copi tutti i contenuti di una directory in un'altra?

Per esempio:

$ cd /home/newuser
$ cp -a /backup/olduser/* .

Il problema di cui sopra è che il modello di globing '*' corrisponde alle directory nascoste '.' e '..' e si finisce con una directory 'olduser' dentro 'newuser', così come i contenuti.

Potresti anche fare qualcosa del genere:

$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser

Ma cosa succede se newuser contiene già alcuni file e directory predefiniti?

Qual è il modo più semplice, più corretto, più facile da ricordare e non disordinato per spostare il contenuto di una directory su un'altra utilizzando solo il comando di base 'cp' e la shell?

33
nomount

Provare:

cp -ra /backup/olduser/. /home/newuser
30
nagul

Due directory a e b.

Entrambi hanno file in.

Sei in una directory che contiene a e b.

cp -r ./a b

-r = ricorsivamente.

23
Rich Bradshaw

Ricorda inoltre che per impostazione predefinita cp copia la prima directory INTO nella seconda directory se esiste la seconda. Ad esempio cp -a a b copierà un INTO b se b esiste, cioè creerà a in b.

Se non è quello che vuoi e vuoi copiare il contenuto di a in b (ad esempio quando copi un intero filesystem in un punto di montaggio) usa :

cp -a a/. b

come nella risposta precedente.

Si noti inoltre che -a include -r così -ar è ridondante.

18
Nicolas Bonnefon

A meno che tu non abbia riconfigurato seriamente la tua shell, il pattern di globi "*" non corrisponde a "." o '..', come puoi verificare usando solo echo *. Quello che fa invece è omettere i file il cui nome inizia con un '.', Quindi il tuo approccio mancherà a tutti i file nascosti. È possibile modificare alcune di queste funzionalità con le opzioni di Shell, ad esempio l'opzione dotglob in bash, ma non sarà l'opzione portatile e affidabile che si sta cercando.

Se hai bisogno di farlo più di una volta o due, ti consiglio di guardare in rsync o unisono (a seconda delle esigenze specifiche) con specifiche di origine e destinazione accuratamente elaborate.

Un'altra alternativa è quella di mettere la directory sorgente in un tarball e decomprimerla sulla directory di destinazione esistente.

6

Questo copierà sia i file normali che quelli nascosti, escludendo la directory principale (..):

cd /directory/to/copy
cp -r * .[^.]* /destination/directory

Se non si esclude la directory padre, si finisce con tutti i contenuti di .. nella directory di destinazione.

2
mch

Questo funziona per copiare tutti i file e le directory ad eccezione delle directory nascoste in modo ricorsivo dalla directory corrente a ovunque:

cp -rf * ^.* 
0
Seeeve

Per copiare file che iniziano con un punto basta fare cp. * Target /

Quindi il modo più semplice è solo eseguire il comando cp due volte.

Come Peter Eisentraut sais le normali regole globbing non includono .. e. (hm, come terminare questa frase?;)

Basta usare -r per renderlo ricorsivo e -i fare in modo che cp chieda se vuoi veramente sovrascrivere un file.

cp -ri /backup/olduser/* /newuser/
cp -ri /backup/olduser/.* /newuser/
0
gaqzi