Да, и нет: -)
В UNIX содержимое файла отличается от записей каталога для этого файла. У вас может быть несколько записей каталога, указывающих на одно и то же содержимое (посмотрите inode для описания того, как это работает), и вот хитрый бит:
Все эти записи каталога равны. Даже если одна из них была создана первой, в этом нет ничего особенного. Если вы удалите его, содержимое не исчезнет, просто запись в каталоге. Содержимое исчезнет, как только у inode будет нулевое количество записей в каталоге, указывающих на него (и все процессы закрывают файл - я был укушен прежде, пытаясь очистить место на диске, удаляя файлы журнала только для того, чтобы найти это, потому что процесс все еще имеет файл открыть, содержимое файла не восстанавливаются, даже если на них нет записей каталога).
Это для жестких ссылок.
Мягкие ссылки немного сложнее. Они создают своего рода «файл» (отдельный индекс), содержащий путь к целевому файлу. И эти ссылки не равны. Удаление оригинала оставит вам мягкую ссылку, указывающую в никуда.
Поскольку inode являются уникальными в данной файловой системе, жесткие ссылки не могут ссылаться на данные в другой файловой системе.
Мягкие ссылки не имеют этого ограничения, поскольку они хранят путь к целевому файлу, а не его индекс.
Может помочь следующая расшифровка:
$ echo hello >f1
$ ln f1 f2
$ ln -s f1 f3
$ ls -ial f*
7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f1
7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f2
4672 lrwxrwxrwx 1 pax None 6 May 11 14:09 f3 -> f1
$ cat f1
hello
$ cat f2
hello
$ cat f3
hello
$ rm f1
$ ls -ial f*
7385 -rw-r--r-- 2 pax None 6 May 11 14:09 f2
4672 lrwxrwxrwx 1 pax None 6 May 11 14:09 f3 -> f1
$ cat f1
cat: f1: No such file or directory
$ cat f2
hello
$ cat f3
cat: f3: No such file or directory
Я использовал только последние четыре цифры номера инода, чтобы сделать запись короткой (и не ударил вас номерами инода, такими как 43910096366994672
), но вы можете видеть, что f1
и f2
имеют точно такие же inode, тогда как f3
отличается. Вы также можете видеть, что содержимое файла, созданного изначально как f1
, сохраняется после его удаления, поскольку f2
все еще ссылается на него.
Однако, поскольку f3
ссылается на имя f1
, а не на его inode, вы получаете сообщение об ошибке при попытке его использовать.
В сторону: Вам должно понравиться, когда UNIX играет с вами так:
$ ls f*
f2 f3
$ cat f3 # What the ...?
cat: f3: No such file or directory
Почти так же весело, как создать файл с именем space backspace x и затем наблюдать за тем, как кто-то пытается его удалить: -)