Чому деякі команди GNU Coreutils мають -T/--no-target-directory
можливість? Схоже, що все, що він робить, може бути досягнуто за допомогою семантики .
(self dot) у традиційній ієрархії каталогів 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 -T
?
.
Трюк робить роботу при копіюванні файлу, тільки не при перейменуванні його базового імені в той же час!cp /path/to/file /target/dir/.
Якщо/target/dir/file
існує і є каталогом, ви отримуєте ту ж діагностику! Але ви показали, що-T
це зробити не можна без цього за один крок, без перегонових умов: скопіюйте файл і змініть його ім'я, не перебуваючи в невідомому підкаталозі.