Рассмотрим 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
выдаст ошибку.