Почему некоторые команды 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
, что нельзя сделать без него за один шаг, без условий гонки: скопируйте файл и измените его имя, не передавая его в подкаталог.