Як перейменувати файл на .. (крапка)?


26

Мабуть, ви можете перейменувати файл у... .

Якби я був божевільний, як би я перейменувати файл ..або .? Чи дозволено таке ім’я файлу?

Зворотний штрих, здається, не відключає особливе значення точки:

$ mv test \.
mv: `test' and `./test' are the same file

11
.і ..вже існують. І крапка не має особливого значення.
ctrl-alt-delor

2
Цікаво, чи можна було створити файли з ім’ям .або ..з Windows на зовнішній FATабо NTFSмедіафайл, а потім спробуйте встановити це в систему на базі Unix. Гм ...
IQAndreas

3
@IQAndreas nope, використовує Windows. і .. приблизно так само ( superuser.com/a/571364/330318 ), як це робить Unix. (І чорт
забирай

2
@PTwr Історія Windows складніше, ніж ця. Деякі особливі речі трапляються на рівні файлової системи / API NT, деякі в підсистемі Win32, а деякі - на рівні оболонки. Наприклад, магія GUID з вашого другого посилання знаходиться на рівні оболонки, тому ви не побачите їх у типовому додатку командного рядка. Я не впевнений , що якщо .і на ..самому справі існує в файлової системі NTFS і NT API , або якщо вони додаються тільки Win32 API. Я знаю, що між API NT нижнього рівня та Win32 є декілька розбіжностей, наприклад, Win32 приховує кілька файлів від кореня диска.
CodesInChaos

@CodesInChaos, наскільки я знаю, точка / dotdot - це віртуальні екземпляри і імітуються в драйвері файлової системи, і це було те саме в старому FAT, який запозичив ( проблемну ) ідею від Unix. Щодо другого посилання, я визнаю, що не прочитав його повністю перед публікацією. Що - щось на зразок цього можна було б , ймовірно , буде краще. (але знову ж таки, цього бракує повної ./ .. інформації)
PTwr

Відповіді:


25

.. не є особливим, це просто те, що воно вже існує.

У Unix, Dos та MS-Windows у кожному каталозі є каталог, який .він посилається на себе, а також каталог, ..який посилається на його батьківський каталог (або самостійно, якщо кореневий каталог).

Якщо ..і .є спеціальними, це лише тому, що ви не можете їх видалити (насправді ви можете, ви просто видаліть каталог, який їх містить).

Тому ви не можете назвати жоден (інший) файл .або ...

Однак ви можете створювати файли ... , \, , .. (примітка є простір після .., але ви навряд чи можете побачити його тут, або просто в вас роздруківку каталогу) або будь-яке інше ім'я вам подобається; Тільки зарезервований характер /(Увага - сучасні деталі: і нуль, нуль є спеціальним символом, для чого не використовується , крім як відзначити кінець речей , а іноді і в якості роздільника). .не має особливого значення: щоб не подавати імена, ядро ​​чи оболонку, воно не потребує втечі. Насправді, якщо ім'я файлу починається з того .часу, воно є спеціальним, файл зазвичай приховано, але все ж його не потрібно уникати.

Убік

Ця поведінка прихованого файлу з’явилася на початку реалізації того місця, lsде автор хотів сховатися, .і ..тому вони написали код, щоб приховати будь-які файли, починаючи з а .. Інші користувачі помітили цю помилку / функцію і почали створювати файли, починаючи з того часу, .коли вони хотіли, щоб файл був прихований.

Пояснення пов'язаного питання

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

При використанні mv у формі mv a b

  • Якщо ви переходите до .нього, це фактично без операцій, але mvтрактує це як помилку.
  • Якщо ви перейдете до ..нього, перемістіть файл у батьківський каталог.

1
Що ви маєте на увазі під If you move to . it is effectively a no operation? Це не "не оп", це помилка, якщо ви намагаєтеся перемістити файл з "А" в "В", коли "А" і "В" - це одне і те ж. Більш практичною демонстрацією цієї помилки є mv foo ../some_dir/fooабо mv foo some_subdir/../foo.
Брандін

7
Для деякого визначення "символу", NUL (0x00) також обмежений у використанні у назвах файлів та каталогів.
користувач117529

1
Відмінність між зарезервованим символом (тобто /NUL) та зарезервованим іменем (тобто .і ..) може бути зрозумілішим. Також варто зазначити, що .на початку ім'я має особливе значення лише на рівні додатків, а не в API ядра або системного виклику.
kasperd

Я думаю, що ваш простір загубився.
nyuszika7h

1
..і . вони особливі: їх не можна переміщати чи видаляти. Але вони не особливі при переміщенні файлів до них.
reinierpost

52

Ви не можете перейменувати файл у .або.. тому, що всі каталоги вже містять записи для цих двох імен. (Ці записи вказують на каталоги, і ви не можете перейменувати файл у каталог.)

mv виявляє випадок, коли місце призначення є існуючим каталогом, і інтерпретує його як запит на переміщення файлу в цей каталог (використовуючи його поточне ім'я).

Зворотні риски не мають нічого спільного з цим, оскільки .це не метафактор оболонки. \.і .такі самі bash.


9

Проблема полягає в тому, що ви переміщуєте файл у каталог. Це дозволяється не вдається.

Я розповім вам, як це було колись.

mkdir використовував по суті, щоб прочитати це (поки я пишу це в sh, це було дійсно написано на C та setuid-root).

mknod d $1
ln -d $1 $1/.
ln -d `dirname $1` $1/..

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

rmdir виглядав так:

rm -d $1/..
rm -d $1/.
rm -d $1

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