Perché alcuni comandi GNU Coreutils hanno l' -T/--no-target-directory
opzione? Sembra che tutto ciò che fa possa essere raggiunto usando la semantica del .
(self dot) in una gerarchia di directory Unix tradizionale.
Considerando:
cp -rT /this/source dir
L' -T
opzione impedisce alla copia di creare una dir/source
sottodirectory. Piuttosto /this/source
viene identificato con dir
e il contenuto viene mappato di conseguenza tra gli alberi. Quindi, ad esempio, /this/source/foo.c
va avanti dir/foo.c
e così via, anziché a dir/source/foo.c
.
Ma questo può essere facilmente realizzato senza l' -T
opzione usando:
cp -r /this/source/. dir # Probably worked fine since dawn of Unix?
Semanticamente, il componente del punto finale viene copiato come figlio di dir
, ma ovviamente quel "figlio" esiste già (quindi non deve essere creato) ed è effettivamente dir
se stesso, quindi l'effetto /this/path
è identificato con dir
.
Funziona bene se la directory corrente è la destinazione:
cp -r /this/tree/node/. . # node's children go to current dir
C'è qualcosa che puoi fare solo con -T
quello che può razionalizzare la sua esistenza? (Oltre al supporto per i sistemi operativi che non implementano la directory dot, una logica non menzionata nella documentazione.)
Il trucchetto di cui sopra non risolve le stesse condizioni di gara menzionate nella documentazione di GNU Info -T
?
.
trucco fa lavoro quando la copia di un file, non solo quando si rinomina il suo nome base allo stesso tempo!cp /path/to/file /target/dir/.
Se/target/dir/file
esiste ed è una directory, ottieni la stessa diagnostica! Ma hai mostrato cosa-T
non può essere fatto senza di esso in un solo passaggio, senza condizioni di competizione: copia un file e modifica il suo nome senza essere deviato in una sottodirectory.