обновление: ответ Mark Plottnick (под моим вопросом) был намного более простым и работы для файлов и каталогов, и дает inode конечного места назначения после любой комбинации промежутка ссылок!
Это было тем, что я искал [если я не забыл особые случаи в своем тестовом каталоге].
Я рад, что конечное решение является настолько изящным и портативным! Mark, отправьте его так, чтобы я мог дать Вам галочку ^^
Я позволяю своему собственному обходному решению ниже, которое теперь смотрит очень глупый ^^
===
Я нашел некоторое невероятно легкое обходное решение, когда целевой файл является каталогом! Просто добавьте "/". после его имени, и у Вас будет каталог конечного места назначения inode! И Вы все еще распечатаете инициирующий путь!
find / -print | xargs -n 1 ls -ild '{}'/. 2>/dev/null | grep inodeyouwant
примечание: это очень тяжело в "попытке сделать это на файле, не зная, является ли это символьная ссылка или hardlink вообще", таким образом, я обновлю с тем, которые только ищут hard-links+symlinks.
Но теперь я должен выяснить способ сделать это для "not-leading-to-a-directory-in-the-end" файла [s] (т.е., links/symlinks/chain-of-those, что в конечной точке к чему-то, что не является каталогом) (еще раз, не изменяя то конечное место назначения!)
Я обновлю, когда я нашел хороший путь к этому
Можно использовать
find /proc/[0-9]*/fd/ -name 24 2> /dev/null | wc -l
Или, если вы настаиваете на использовании ls
(это должен быть один из немногих примеров, где это безопасно):
ls /proc/[0-9]*/fd 2>/dev/null | grep -c '^24$'
Ваша первая попытка не удалась, так как вы перенаправляли вывод в файл (> вывод. txt
), что означает, что grep
никогда не будет совпадать, так как не было вывода, с которым можно было бы сопоставить вывод. Вы можете либо использовать трубы (|
), как я делал это выше, либо использовать ;
или &
для разделения команд:
ls /proc/[0-9]*/fd 2> errors.txt > stdout.txt; grep "^24" stdout.txt | wc -l
Здесь нет пункта вызова ls
или найти
. Это оболочка, которая делает работу, расширяя глобус.
Просто:
set -- /proc/[0-9]*/fd/24 && echo "$#"
Оговорка в том, что кроме zsh
, если вы получите 1
, вы не знаете, потому ли это, что он есть, или если шаблон не совпал.
С помощью bash
вы можете сделать
shopt -s nullglob
fds=(/proc/[0-9]*/fd/24)
echo "${#fds[@]}"
Другой вариант, который был бы более портативным, это использовать lsof
:
lsof -td24 | wc -l