Как я могу найти разницу между папкой и ссылкой на папку в Ubuntu?

Ранее я создал несколько ссылок на другую папку, используя следующую команду.

sudo ln -s path_name link_name 

Эти ссылки похожи на папки. Я не могу отличить папку от ссылки. Есть ли способ найти разницу между папкой и ссылкой на другую папку?

4 ответа

Решение

Вы можете узнать ссылку по маленькой стрелке (->) на выходе 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 добавлять символы в имена файлов

* для исполняемых файлов

/ для каталогов

@ для символических ссылок **

| для FIFO

> для дверей (что бы это ни значило)

= для розеток

обычные файлы не имеют классификатора в конце. Так что в вашем случае вы увидите @ в конце каждого имени символической ссылки и / в конце реального каталога.

Однако, если вы используете ls -l вы не увидите классификаторы для символических ссылок, а вместо этого вы увидите -> и связать цель после этого.

Вы также можете использовать stat а также file различать dirs/ символические ссылки, например:

$ 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
  [...]
Другие вопросы по тегам