Рассмотрим cp a b/c .
Если c не существует (а b существует), оно будет интерпретировано как имя для копии a , поэтому вы закончите с b/c .
С другой стороны, если c существует и это каталог, он будет интерпретирован как путь, в котором нужно поместить a под неизменным именем a , поэтому вы закончите с b/c/a .
Я предполагаю, что в начале /home/jake/project/__workspace/scalaProjects/scalaML/src/main/scala не существует, есть только /home/jake/project/__workspace/scalaProjects/scalaML/src/main/ .
Ваша первая команда создает scala действуя как (1). Это может несколько сбивать с толку, потому что вместо scala и a вас есть c , поэтому не очевидно, что происходит какое-то тривиальное переименование (от scala до scala). Тогда вторая команда действует как (2).
Эта команда будет работать как ваша первая, независимо от того, существует ли целевая scala , если существует только /home/jake/project/__workspace/scalaProjects/scalaML/src/main/ :
cp -av /home/jake/transit/scalaProjects/scalaML/src/main/scala /home/jake/project/__workspace/scalaProjects/scalaML/src/main/
Но если /home/jake/project/__workspace/scalaProjects/scalaML/src/main/ не существует и /home/jake/project/__workspace/scalaProjects/scalaML/src/ , ваша scala будет помещена туда под именем main Это снова поведение (1).
Чтобы избавиться от этой неоднозначности, используйте -t:
cp -av /home/jake/transit/scalaProjects/scalaML/src/main/scala -t /home/jake/project/__workspace/scalaProjects/scalaML/src/main/
Это делает cp интерпретировать main как каталог, в который вы хотите поместить scala . Переименование не будет. Если /home/jake/project/__workspace/scalaProjects/scalaML/src/main/ не существует, cp выдаст ошибку.