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?
Provare:
cp -ra /backup/olduser/. /home/newuser
Due directory a e b.
Entrambi hanno file in.
Sei in una directory che contiene a e b.
cp -r ./a b
-r
= ricorsivamente.
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.
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.
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.
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 * ^.*
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/