Copia i file da una directory in una directory esistente


248

In bash ho bisogno di fare questo:

  1. prende tutti i file in una directory

  2. copiarli in una directory esistente

Come faccio a fare questo? Ho provato cp -r t1 t2(sia t1 che 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 in t1 vadano direttamente all'interno di t2. Come faccio a fare questo?


11
Perché è stato chiuso? È arbitrario se un comando bash è un comando incorporato o esterno (es. Printf esiste come entrambi sulla maggior parte dei sistemi), quindi le cpdomande possono essere viste come bashdomande, che è un linguaggio di programmazione. Non ho mai visto una domanda su Python parlare della copia di un file chiusa.
Ciro Santilli 9 冠状 病 六四 事件 法轮功


Sono arrivato alla ricerca di un promemoria sulla sintassi del comando di copia della shell Bash e sono felice di segnalare che questi comandi sembrano funzionare anche con il file system NTFS sottostante sulla mia installazione di Windows.
David A. Gray,

Risposte:


396

Quello che vuoi è:

cp -R t1/. t2/

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


2
Mi piace molto questa sintassi, ma per qualche motivo non funziona mv. Qualcuno sa perché?
Martin von Wittich,

2
Sorprendente. Dove è documentato? POSIX o estensione?
Ciro Santilli 9 冠状 病 六四 事件 法轮功

9
@CiroSantilli 六四 事件 法轮功 包 卓 轩 Se copi una directory, cp creerà una directory e copierà tutti i file in essa contenuti. Se si utilizza la cartella pretend denominata ".", Che è la stessa della directory che la contiene, la copia si comporta in questo modo. Supponiamo che t1 contenga un file chiamato "file". cp eseguirà l'operazione equivalente a "cp t1 /./ file t2 /./". Sta copiando la cartella ".", Ma sta copiando i file in t2 "." la cartella rimuove "./" perché "t2 /./" è uguale a "t2 /". Tecnicamente, questo significa che è un comportamento integrato in POSIX ... ma probabilmente non nel modo che ti aspettavi!
colpisce il


32
cp dir1/* dir2

O se hai directory dentro dir1 che vorresti copiare pure

cp -r dir1/* dir2

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

2
Copiare dir1/.*non è una buona idea, in quanto copia dir1 / .. (ovvero il genitore della directory che stai effettivamente cercando di copiare). Copia anche dir1 /. il che va bene, tranne per il fatto che è già stato (principalmente) copiato, quindi stai facendo il lavoro due volte.
Gordon Davisson,

1
È possibile aggirare il dir1/.*problema dei file nascosti / cd inserendo nella directory da cui si desidera copiare e facendo riferimento ad esso come .. Quindi, se si desidera copiare tutti i file inclusi i file nascosti da una directory in una directory esistente, è possibile: cd [source dir], cp . [path to destination dir, with no trailing slash].
Rob

8

Supponendo che t1 sia la cartella contenente i file e t2 sia la directory vuota. Quello che vuoi è qualcosa del genere:

sudo cp -R t1/* t2/

Tieni presente, per il primo esempio, t1 e t2 devono essere i percorsi completi o i percorsi relativi (in base a dove ti trovi). Se lo desideri, puoi accedere alla cartella vuota (t2) e procedere come segue:

sudo cp -R t1/* ./

Oppure puoi accedere alla cartella con i file (t1) e procedere come segue:

sudo cp -R ./* t2/

Nota: il segno * (o carattere jolly) indica tutti i file e le cartelle. Il flag -R significa ricorsivamente (tutto dentro ogni cosa).


2
cp -R t1/ t2

La barra finale sulla directory di origine modifica leggermente la semantica, quindi copia il contenuto ma non la directory stessa. Evita anche i problemi con i globbing e i file invisibili che la risposta di Bertrand ha (copiare i t1/*file invisibili mancanti, copiare `t1 / * t1 /.* 'copie t1 / .e t1 / .., che non si desidera).


La tua soluzione non funziona, almeno non sulla mia installazione (ubuntu 12.10) $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 (scusate nessun formato di codice nei commenti, versione leggibile su pastebin.com/yszSxV6G )
zpon,

2

A seconda di alcuni dettagli potresti dover fare qualcosa del genere:

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

... questo sostanzialmente cambia nella directory SRC e la copia sulla destinazione, quindi ritorna da dove hai iniziato.

Il trambusto extra è gestire obiettivi relativi o assoluti.

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


1

Per all'interno di alcune directory, questo verrà utilizzato per intero poiché copia tutti i contenuti da "cartella1" nella nuova directory "cartella2" all'interno di alcune directory.

$ (pwd) otterrà il percorso per la directory corrente.

Notare il punto (.) Dopo la cartella1 per ottenere tutti i contenuti all'interno della cartella1

cp -r $(pwd)/folder1/. $(pwd)/folder2
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.