2012-06-28 8 views
19

Su Linux, ho un'opzione --parents disponibili per il comando cp così posso farecp --parents su Mac

cp --parents test/withintest/go.rb test2 

http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html

Su Mac, non ho questa opzione a disposizione. C'è un modo per farlo su Mac? Perché questa opzione non è disponibile?

PS. Lo scopo della --parents è la seguente:

‘--parents’ Forma il nome di ogni file di destinazione aggiungendo alla directory di destinazione una barra e il nome specificato del file di origine.

L'ultimo argomento assegnato a cp deve essere il nome di una directory esistente .

Ad esempio, il comando:

 cp --parents a/b/c existing_dir 

copia il file a/b/c per existing_dir/a/b/c, creando qualsiasi directory intermedia mancante.

risposta

17

È possibile utilizzare il comando ditto su Mac OS X:

La forma di base

ditto <src-path> <dst-path> 

fa ciò che si vuole. Ci sono anche molte più opzioni: dai un'occhiata allo man page.

+0

Perfetto. 'idem alcuni/dir/structure/file/tmp/some/dir/structure/file' crea le directory/dir/structure sotto/tmp, come desiderato. – ca2longoria

+5

Non vedo come questo risponda alla domanda originale. 'cp --parents a/b/c existing_dir' e' ditto a/b/c existing_dir' sembrano fare cose diverse. – Alec

+1

@alecb Penso che la risposta fosse rivolta a ciò che l'OP voleva effettivamente ottenere, piuttosto che al metodo esatto. Stavo attraversando lo stesso processo di pensiero quando ho scoperto il comando 'idem'. – Echelon

32

Questo mi ha infastidito parecchio. Una soluzione alternativa potrebbe essere l'uso di rsync.

rsync -R test/withintest/go.rb test2 

ha lo stesso effetto di cp --parents e OS X viene fornita di serie con rsync.

2

È possibile installare la versione GNU di cp utilizzando MacPorts.

Dopo l'installazione di MacPorts è possibile installare i pacchetti coreutils:

sudo port install coreutils 

Allora si sarà in grado di utilizzare la versione GNU cp e altri utilitites core (ls, date, cat, etc.) anteponendo al comando con un g:

gcp --parents test/withintest/go.rb test2 

Se si desidera che queste versioni GNU per essere utilizzato di default è possibile aggiungere la GNU bin aggiornare il vostro percorso. Aggiungere quanto segue al vostro ~/.bash_profile:

export PATH="/opt/local/libexec/gnubin:$PATH" 
0

io non sostituirei mac cp con GNU cp. Inoltre non avrei usato idem perché non è multipiattaforma.Invece utilizzare strumenti multi-piattaforma, come ad esempio rsync:

rsync <srcDir/srcFile> <dst> 

Risultato: dst/srcdir/SRCFILE