Почему некоторые команды GNU Coreutils имеют -T/--no-target-directoryопцию? Кажется, что все, что он делает, может быть достигнуто с помощью семантики .(собственной точки) в традиционной иерархии каталогов Unix.
Принимая во внимание:
cp -rT /this/source dir
Эта -Tопция предотвращает создание копии dir/sourceподкаталогом. Скорее /this/sourceидентифицируется с dirи содержимое отображается между деревьями соответственно. Так, например, /this/source/foo.cидет dir/foo.cи так далее, а не к dir/source/foo.c.
Но это может быть легко достигнуто без использования -Tопции:
cp -r /this/source/. dir # Probably worked fine since dawn of Unix?
Семантически компонент задней точки копируется как дочерний элемент dir, но, конечно, этот «дочерний элемент » уже существует (поэтому его не нужно создавать) и фактически является dirсамим собой, поэтому эффект /this/pathидентифицируется с dir.
Это работает нормально, если текущий каталог является целью:
cp -r /this/tree/node/. . # node's children go to current dir
Есть ли что-то, что вы можете сделать только с этим, -Tчтобы рационализировать его существование? (Помимо поддержки операционных систем, которые не реализуют каталог точек, обоснование, не упомянутое в документации.)
Разве вышеприведенный точечный фокус не решает те же условия гонки, о которых говорится в документации GNU Info -T?
.Трюк делает работу при копировании файла, только не при переименовании его базового имени в то же время!cp /path/to/file /target/dir/.Если/target/dir/fileсуществует и является каталогом, вы получаете такую же диагностику! Но вы показали-T, что нельзя сделать без него за один шаг, без условий гонки: скопируйте файл и измените его имя, не передавая его в подкаталог.