Яка додаткова вартість опції -T у GNU cp та mv?


26

Чому деякі команди 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?

Відповіді:


29

Ваш .трюк можна використовувати лише тоді, коли ви копіюєте каталог, а не файл. -TОпція працює як з каталогами та файлами. Якщо ти зробиш:

cp srcfile destfile

і вже є каталог з ім'ям, який destfileвін буде скопіювати destfile/srcfile, який може не бути призначеним. Отже, ви використовуєте

cp -T srcfile destfile

і ви правильно отримаєте помилку:

cp: cannot overwrite directory `destfile' with non-directory

Якщо ви спробували скористатися .методом, копія ніколи не працюватиме:

cp: cannot stat `srcfile/.`: Not a directory

.Трюк робить роботу при копіюванні файлу, тільки не при перейменуванні його базового імені в той же час! cp /path/to/file /target/dir/. Якщо /target/dir/fileіснує і є каталогом, ви отримуєте ту ж діагностику! Але ви показали, що -Tце зробити не можна без цього за один крок, без перегонових умов: скопіюйте файл і змініть його ім'я, не перебуваючи в невідомому підкаталозі.
Каз

3
Це не те саме - .трюк, про який ви говорите, - додавання /.до джерела .
Бармар

21

Проблема з cp/ mv/, lnяк вони були спочатку розроблені, полягає в тому, що вони складають дві команди в одній ( скопіювати і скопіювати в ).

cp A B

це або копія від A до B, або копія від A до B ( копія від A до B / A ), залежно від того, Bіснує та є каталог чи ні (і більше варіантів, якщо B є символьним посиланням на каталог).

Це погано, тому що це неоднозначно. Отже, реалізація GNU додала варіанти для вирішення цього питання.

cp -T A B

копії від A до B незалежно. Якщо Bіснує та є каталог, це не вдасться (якщо ви не передасте -r). У будь-якому випадку, ви не будете мати Aфайл ізсередини, Bколи ви планували Aскопіювати у B.

І:

cp -t B A

це копія в .


Оригінальна філософія Unix - припускати, що ви знаєте, що робите, і з радістю дозволить вам стріляти в ногу.
Ленна

4
@Lenne, але тут це не дає тобі способу уникнути стрілянини в ногу. Якщо хтось створить каталог B або символізує посилання на якийсь каталог безпосередньо перед запуском cp A Bкоманди, він не виконає те, що ви задумали. І все [ -e B ] || [ -L B ] || cp A Bще має стан перегонів, яких cp -Tn A Bнемає.
Стефан Шазелас

6

Показник -Tможе дати збій, якщо в каталозі неправильно існує те, що має бути файлом призначення:

$ mkdir mustbeafile
$ touch afile
$ cp -T afile mustbeafile
cp: cannot overwrite directory `mustbeafile' with non-directory
$ echo $?
1
$ cp afile mustbeafile
$ 

Тобто, замість успіху на несподівану копію-в-субдір, відбувається попередження і недобрий статус виходу, що може призвести до переривання сценарію, і людина перевірить, чому існує каталог, де не повинен бути одним.


0

Використання прапора також набагато зрозуміліше і менше ризику ненавмисних ефектів, коли команда використовується в скрипті замість введеного вручну. Налаштування крапок на доріжках у сценарії може виявитись у всіх видах несподіваних помилок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.