Я ищу способ, если он существует, узнать, является ли путь к папке символической ссылкой или оригинальный путь к папке.
Есть ли такая вещь?
Есть много способов, мой обычный способ - использовать stat
guiverc@ultracrap:~$ stat vids
File: vids -> Videos/
Size: 7 Blocks: 0 IO Block: 4096 symbolic link
Device: fd00h/64768d Inode: 524725 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ guiverc) Gid: ( 1001/ guiverc)
Access: 2019-05-25 00:16:26.708558789 +1000
Modify: 2019-05-25 00:16:26.708558789 +1000
Change: 2019-05-25 00:16:26.708558789 +1000
Birth: -
. Вы заметите, что мои ~ / vids - это символическая ссылка на мою директорию ~ / Videos /
.Чтобы определить, является ли папка символической ссылкой, вы можете использовать любой из этих методов.
Метод графического интерфейса :
Значок папки будет другим. Значок папки будет иметь стрелку.
Метод CLI
Вывод ls -l
будет четко указывать что папка является символической ссылкой, и она также перечислит папку, на которую она указывает.
$ ls -l
total 4
drwxr-xr-x 2 jabard domain users 4096 mai 24 15:56 original
lrwxrwxrwx 1 jabard domain users 8 mai 24 symbolic -> 15:56 original
Здесь symbolic
- символическая ссылка, указывающая на папку original
.
Начальная l
в lrwxrwxrwx
представляет символическую ссылку , в то время как d
представляет папку (каталог ), а -
представляет файл .
Альтернативный подход:
1, используя file
file /usr/lib/jvm/jre-9
/usr/lib/jvm/jre-9: symbolic link to /etc/alternatives/jre_9
2, используя readlink
readlink -f /usr/lib/jvm/jre-9
/usr/lib/jvm/java-9-openjdk-9.0.4.11-6.fc28.x86_64
Здесь вы можете видеть, что путь расширен связать цель
Если вы хотите программно проверить, является ли данный объект простым каталогом или символической ссылкой на каталог, вы можете использовать команду test
. Обратите внимание, что он возвращает , это каталог для каталогов и символических ссылок на каталоги, но возвращает только , это символическая ссылка для символических ссылок. Отсюда:
#!/usr/bin/env bash
mkdir i_am_a_directory
ln -s i_am_a_directory i_am_a_symlink_to_a_directory
for object in i_am_a_directory i_am_a_symlink_to_a_directory; do
if test -d $object; then
if test -L $object; then
echo "$object is a symlink to a directory"
else
echo "$object is just a plain directory"
fi
else
echo "$object is not a directory (nor a link to one)"
fi
done
Результат:
i_am_a_directory is just a plain directory
i_am_a_symlink_to_a_directory is a symlink to a directory
namei
будет разбивать каждый компонент в пути, независимо от того, ведет ли путь к каталогу или нет.
Например, мой ~/Playlists
является символической ссылкой на Documents/Playlists
, а сам Documents
является символической ссылкой на Dropbox/Documents
:
$ namei Playlists
f: Playlists
l Playlists -> Documents/Playlists
l Documents -> Dropbox/Documents
d Dropbox
d Documents
d Playlists
В этом выводе
f:
означает имя пути, которое в настоящее время разрешается l
означает символьную ссылку d
означает каталог [ 1111] (папка) Перейдите в родительский каталог подозреваемой символической ссылки и выполните
ls -la
-a
на случай, если ваш файл - .
скрытый файл.
Затем он должен начинаться с l
, если это ссылка:
(automl-meta-learning) miranda9~/automl-meta-learning/automl-proj/experiments $ ls -la ~
total 136
drwx------. 18 miranda9 miranda9 4096 May 2 15:55 .
drwxr-xr-x. 23 root root 0 May 2 15:45 ..
drwxrwxr-x. 8 miranda9 miranda9 4096 May 2 12:17 automl-meta-learning
-rw-------. 1 miranda9 miranda9 49858 May 2 15:10 .bash_history
-rw-r--r--. 1 miranda9 miranda9 18 Aug 22 2019 .bash_logout
-rw-r--r--. 1 miranda9 miranda9 176 Aug 22 2019 .bash_profile
-rw-r--r--. 1 miranda9 miranda9 1132 May 2 12:49 .bashrc
drwxrwxr-x. 6 miranda9 miranda9 70 Jan 30 14:29 .cache
lrwxrwxrwx. 1 miranda9 miranda9 26 May 2 15:55 .conda -> /home/miranda9/miniconda3/
см. Последнюю:
lrwxrwxrwx. 1 miranda9 miranda9 26 May 2 15:55 .conda -> /home/miranda9/miniconda3/
начинается с l
и даже показывает, куда он указывает.