Чому деякі команди 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це зробити не можна без цього за один крок, без перегонових умов: скопіюйте файл і змініть його ім'я, не перебуваючи в невідомому підкаталозі.