Заново создать новую ссылку и удалить старую ссылку по одной команде
Согласно справочной странице:
man ln
-f, --force
remove existing destination files
чтобы я понял, хочу ли я заново создать новую ссылку на какой-либо каталог / файл назначения
Я могу просто сделать
ln -s -f some_directory new_link
но это не то, что я получил от своих машин Linux/ Solaris
например
[u@h w]# mkdir dir1
[u@h w]# ln -s dir1 link
[u@h w]# ls -l
drwxr-xr-x 2 root root 4096 Mar 16 20:26 dir1
lrwxrwxrwx 1 root root 4 Mar 16 20:27 link -> dir1
[u@h w]# ln -s -f dir1 new_link
теперь я согласился увидеть, что new_link теперь указывает на dir1, тогда как "link" не существует, но ссылка все еще указывает на dir1?
как восстановить новую ссылку и в то же время удалить старую ссылку в одной команде?
(Я не хочу использовать команду rm)
[u@h w]# ls -l
drwxr-xr-x 2 root root 4096 Mar 16 20:26 dir1
lrwxrwxrwx 1 root root 4 Mar 16 20:27 link -> dir1
lrwxrwxrwx 1 root root 4 Mar 16 20:28 new_link -> dir1
Другой другой пример
#
# mkdir dir
#
# ln -s dir link
#
# mv dir dir_new
# ls -l
total 32
drwxr-xr-x 2 root root 117 Mar 16 21:44 dir_new
lrwxrwxrwx 1 root root 3 Mar 16 21:44 link -> dir
# ln -s -f dir_new link
ln: cannot create link: File exists
Можно ли обновить текущую ссылку, чтобы указать на новый каталог / файл
(без, чтобы получить файл существует?),
или заставить заново создать ссылку на другой каталог?
2 ответа
-f
опция позволяет вам перезаписать целевой файл, то есть файл с именем, с которым вы создаете ссылку, новой ссылкой. Он не проверяет другие ссылки в том же каталоге.
Пример:
$ touch file1
$ touch file2
$ ln -s file1 link1
$ ls -l
total 8
-rw-r--r-- 1 jenny staff 0 Mar 16 21:13 file1
-rw-r--r-- 1 jenny staff 0 Mar 16 21:13 file2
lrwxr-xr-x 1 jenny staff 5 Mar 16 21:13 link1 -> file1
$ ln -s file2 link1
ln: link1: File exists
$ ln -s -f file2 link1
$ ls -l
total 8
-rw-r--r-- 1 jenny staff 0 Mar 16 21:13 file1
-rw-r--r-- 1 jenny staff 0 Mar 16 21:13 file2
lrwxr-xr-x 1 jenny staff 5 Mar 16 21:14 link1 -> file2
Если вы просто хотите переместить имя ссылки, чтобы вместо вызова link1
это должно называться newlink
Просто переместите его:
$ mv link1 newlink
$ ls -l
total 8
-rw-r--r-- 1 jenny staff 0 Mar 16 21:13 file1
-rw-r--r-- 1 jenny staff 0 Mar 16 21:13 file2
lrwxr-xr-x 1 jenny staff 5 Mar 16 21:14 newlink -> file2
Если вы работаете с каталогами вместо файлов, вам нужно добавить опцию -n
так же как -f
:
$ ls -l
total 16
drwxrwxr-x 2 jenny jenny 4096 Mar 18 10:37 dir1
drwxrwxr-x 2 jenny jenny 4096 Mar 18 10:37 dir2
$ ln -s dir1 link1
$ ls -l
total 20
drwxrwxr-x 2 jenny jenny 4096 Mar 18 10:37 dir1
drwxrwxr-x 2 jenny jenny 4096 Mar 18 10:37 dir2
lrwxrwxrwx 1 jenny jenny 4 Mar 18 10:37 link1 -> dir1
$ ln -s -n -f dir2 link1
$ ls -l
total 20
drwxrwxr-x 2 jenny jenny 4096 Mar 18 10:37 dir1
drwxrwxr-x 2 jenny jenny 4096 Mar 18 10:37 dir2
lrwxrwxrwx 1 jenny jenny 4 Mar 18 10:38 link1 -> dir2
mv
Насколько я могу судить, атомарен и будет делать то, что вы хотите:
mv link new_link