2010-09-04 20 views
150

in bash ho bisogno di fare questo:Copiare i file da una directory in una directory esistente

  1. prendere tutti i file in una directory

  2. copiarli in una directory esistente

Come posso fare questo? Ho provato cp -r t1 t2 (entrambi t1 e t2 sono directory esistenti, t1 contiene file) ma ha creato una directory chiamata t1 all'interno di t2, non lo voglio, ho bisogno che i file di t1 passino direttamente all'interno di t2. Come faccio a fare questo?

+7

Perché è stato chiuso? È arbitrario se un comando bash è un comando incorporato o esterno (ad esempio printf esiste come entrambi nella maggior parte dei sistemi), quindi le domande 'cp' possono essere viste come domande' bash', che è un linguaggio di programmazione. Non ho mai visto una domanda Python che parlava della chiusura di un file. –

+0

Dai un'occhiata a https://stackoverflow.com/questions/23698183/how-to-force-cp-to-overwrite-directory-instead-of-creating-another-one-inside – theGiallo

risposta

18
cp dir1/* dir2 

O se avete directory dentro dir1 che ci si vuole copiare e

cp -r dir1/* dir2 
+2

A seconda di come è la tua shell configurato, probabilmente dovrai usare "dir1/* dir1 /.*" invece di "dir1/*" se vuoi anche catturare i file nascosti. – ssokolow

+2

Copia di 'dir1 /.* 'non è una buona idea, dato che copia dir1/.. (cioè il genitore della directory che stai effettivamente cercando di copiare). Copia anche dir1 /. che va bene, tranne che è già stato (per lo più) copiato, quindi stai facendo il lavoro due volte. –

+1

È possibile aggirare il problema del file 'dir1 /.*'/hidden inserendo cd nella directory da cui si desidera copiare e quindi riferirsi ad esso come '.'. Quindi, se vuoi copiare tutti i file compresi i file nascosti da una directory in una directory esistente, puoi: 'cd [source dir]', 'cp. [percorso per dir di destinazione, senza barra finale] '. – RobW

2
cp -R t1/ t2 

la barra finale della directory sorgente cambia leggermente la semantica, in modo che copia il contenuto ma non la directory stessa. Evita anche i problemi con file globbing e invisibili che la risposta di Bertrand ha (copiando t1/* manca file invisibili, copiando `t1/* t1 /.* 'copie t1 /. E t1/.., che non si desidera).

+0

La soluzione non funziona, almeno non sulla mia installazione (Ubuntu 12.10) '$ mkdir t1' ' $ mkdir t2' 'tocco t1 $/One' ' $ touch T1/two' '$ touch T1/.three' '$ cp -R T1/t2' ' $ ls t2/'' t1' (mi dispiace non codeformat nei commenti, la versione leggibile a http://pastebin.com/yszSxV6G) – zpon

1

seconda su alcuni dettagli che potrebbe essere necessario fare qualcosa di simile:

r=$(pwd) 
case "$TARG" in 
    /*) p=$r;; 
    *) p="";; 
    esac 
cd "$SRC" && cp -r . "$p/$TARG" 
cd "$r" 

... questo cambia sostanzialmente la directory SRC e lo copia il bersaglio, poi torna di nuovo a dove mai hai iniziato.

L'agitarsi extra è gestire obiettivi relativi o assoluti.

(Questo non si basa sulla semantica sottile del comando cp stesso ... su come gestisce le specifiche della sorgente con o senza un trailing/... poiché non sono sicuro che siano stabili, portatili e affidabili oltre appena GNU cp e non so se continueranno ad esserlo in futuro).

242

quello che vuoi è:

cp -R t1/. t2/ 

Il punto alla fine dice di copiare il contenuto della directory corrente, non la directory stessa. Questo metodo include anche file e cartelle nascosti.

+2

davvero come questa sintassi, ma per qualche motivo non funziona con 'mv'. Qualcuno sa perché? –

+1

Incredibile. Dove è documentato? È POSIX o estensione? –

26

Se si vuole copiare qualcosa da una directory nella directory corrente , fare questo:

cp dir1/* . 

Questo presuppone che non stai cercando di copiare i file nascosti.

+11

Manca i file nascosti. –

Problemi correlati