Come copiare i file dalla cartella senza la cartella stessa


39

Sto cercando di copiare file e sottocartelle da una cartella senza la stessa A. Ad esempio, una cartella contiene il prossimo:

| file1.txt   
| file2.txt    
| subfolder1   

L'esecuzione del comando successivo mi dà un risultato sbagliato:

sudo cp -r /home/username/A/ /usr/lib/B/

Il risultato è

/usr/lib/B/A/...copied files...

invece di..

/usr/lib/B/...copied files...

Come posso raggiungere quello previsto senza la cartella di origine

Risposte:


67

cp avanzato

cp -r /home/username/A/. /usr/lib/B/

Questo è particolarmente utile perché funziona indipendentemente dal fatto che la directory di destinazione esista già.

gorgoglio delle conchiglie

Se non ci sono troppi oggetti nella directory, puoi usare il globbing della shell:

mkdir -p /usr/lib/B/
shopt -s dotglob
cp -r /home/username/A/* /usr/lib/B/

rsync

rsync -a /home/username/A/ /usr/lib/B/

Alla /fine del percorso sorgente è importante; funziona indipendentemente dal fatto che la directory di destinazione esista già.

trova

mkdir -p /usr/lib/B/
find /home/username/A/ -mindepth 1 -maxdepth 1 -exec cp -r -t /usr/lib/B/ {} +

o se non hai bisogno di sottodirectory vuote:

find /home/username/A/ -mindepth 1 -type f -exec cp --parents -t /usr/lib/B/ {} +

(senza mkdir)


Il primo funziona bene! Qualche idea sul perché home / username / A / * (con il simbolo a stella) non abbia senso? La variante con punto alla fine mi ha aiutato, grazie!
pushandpop,

@pushandpop A/*ha un senso ma ci sono situazioni in cui non funziona.
Hauke ​​Laging,

3
shoptè bashspecifico. Con zsh, utilizzare *(D). con ksh93, FIGNORE='@(.|..)'. cp -tè specifico per GNU. Quello findnon funzionerà correttamente poiché copierà sia il A/suo contenuto (compresi i sottodiretti) più volte.
Stéphane Chazelas,

1
Volete anche -maxdepth 1( -mindepthed -maxdepthessendo le estensioni GNU ora supportate anche da pochi altri. Portabile find .../. ! -name . -prune -exec ....)
Stéphane Chazelas

@ StéphaneChazelas Immagino che ci sia un errore di battitura da qualche parte. find .../.causa un errore qui.
Hauke ​​Laging,

10

Se su un sistema GNU, da man cp:

   -T, --no-target-directory
          treat DEST as a normal file

Questo ti permette di scrivere cp -rT /home/username/A/ /usr/lib/B/per fare esattamente la cosa giusta.


Questa dovrebbe essere la risposta accettata, questo è corretto del gorgogliamento delle conchiglie o dell'uso di qualcos'altro cp. Ma è vero che -Tnon funzionerà con un non GNU cp.
noraj,

3

Indica cpdi copiare il contenuto della directory e non la directory stessa:

sudo cp -r /home/username/A/* /usr/lib/B/

Grazie! Ma dice: / usr / lib / B / non è una directory
pushandpop

Dovrai shopt -s dotglobfarlo funzionare se ci sono file dot in /home/username/A/.
talkloud

1
@pushandpop bene, sì. Questo è l'obiettivo che avevi nella tua domanda, quindi ho pensato che fosse una directory. È necessario creare la destinazione prima di tentare di copiare i file al suo interno.
terdon
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.