Considerar cp a b/c.
Si c no existe (y b lo hace), se interpretará como un nombre para la copia de a, así terminarás con b/c.
Por otro lado si c existe y es un directorio, se interpretará como una ruta donde colocar a bajo el nombre sin cambios a, así terminarás con b/c/a.
Supongo que al principio /home/jake/project/__workspace/scalaProjects/scalaML/src/main/scala no existe, solo hay /home/jake/project/__workspace/scalaProjects/scalaML/src/main/.
Tu primer comando crea scala Actuando como (1). Puede ser algo confuso porque tienes scala en lugar de a y c, por lo que no es obvio que tenga lugar un cambio de nombre trivial (desde scala a scala ). Entonces el segundo comando actúa como (2).
Este comando funcionará como el primero, independientemente de si el objetivo scala existe, si solo /home/jake/project/__workspace/scalaProjects/scalaML/src/main/ existe:
cp -av /home/jake/transit/scalaProjects/scalaML/src/main/scala /home/jake/project/__workspace/scalaProjects/scalaML/src/main/
Pero Si /home/jake/project/__workspace/scalaProjects/scalaML/src/main/ no existe y /home/jake/project/__workspace/scalaProjects/scalaML/src/ Tu scala será colocado allí bajo el nombre main. Este es el comportamiento (1) de nuevo.
Para deshacerse de esta ambigüedad utiliza -t:
cp -av /home/jake/transit/scalaProjects/scalaML/src/main/scala -t /home/jake/project/__workspace/scalaProjects/scalaML/src/main/
Esto hace cp interpretar main como un directorio donde quieres colocar scala. No se llevará a cabo ningún cambio de nombre. Si /home/jake/project/__workspace/scalaProjects/scalaML/src/main/ no existe cp lanzará un error.