Ранее, я создал некоторые ссылки на другую папку с помощью следующей команды.
sudo ln -s path_name link_name
Эти ссылки выглядят подобными папкам. Я не могу дифференцироваться между папкой и ссылкой. Существует ли способ найти различие между папкой и ссылкой на другую папку?
Вы могли распознать ссылку любым маленькая стрелка (->
) в выводе ls -l
:
или выдающимся цветом, также появляющимся в выводе ls
, как описано в этот ответ (test2
ссылка):
Существует много способов видеть это. В первую очередь, это обозначается в выводе ls -l
. Обратите внимание, что каталог имеет d
в начале поля полномочий, в то время как ссылка имеет l
:
$ ls -l
drwxr-xr-x 2 terdon terdon 4096 Feb 13 14:12 bar
lrwxrwxrwx 1 terdon terdon 3 Feb 13 14:12 foo -> bar
можно также использовать file
:
$ file bar foo
bar: directory
foo: symbolic link to `bar'
Другой выбор readlink
, который переходит по символьным ссылкам к их целям:
$ readlink foo
bar
Выполнение readlink bar
не возвратит вывода (оно перестало работать, возвращая не0 кодов выхода), таким образом, можно сделать что-то как:
readlink bar || echo "Not a link!"
или
readlink foo && "Echo this is a link"
Наконец, Вы могли также использовать find
или сама оболочка для списка всех ссылок:
find . -type l
или
for f in *; do [ -L "$f" ] && echo "$f is a link"; done
Читайте man [
(или man test
), и Вы будете видеть, что можно сделать:
for theDir in path_name link_name ; do
if [ -L $theDir ] ; then
echo "$theDir exists and is a symbolic link"
elif [ -d $theDir ] ; then
echo "$theDir exists and is a directory"
fi
done
я изменил порядок тестов, таким образом проверение на каталог сделано, только если $theDir
не ссылка.
используйте ls -F
.
это заставит ls добавить символы к именам файлов
*
для исполняемых файлов
/
для каталогов
@
для символьных ссылок **
|
для FIFOs
>
для дверей (независимо от того, что это означает)
=
для сокетов
, регулярные файлы не имеют классификатора в конце. Таким образом в Вашем случае Вы будете видеть @
в конце каждого имени символьной ссылки и /
в конце реального каталога.
Однако, если Вы используете ls -l
, Вы не будете видеть классификаторы для символьных ссылок, и вместо этого Вы будете видеть ->
и цель ссылки после этого.
можно также использовать stat
и file
для дифференциации директоров/символьных ссылок, например:
$ file a
a: directory
$ file b
b: symbolic link to a
$ stat a
File: 'a'
Size: 40 Blocks: 0 IO Block: 4096 directory
[...]
$ stat b
File: 'b' -> 'a'
Size: 1 Blocks: 0 IO Block: 4096 symbolic link
[...]