Как распечатать общее количество дескрипторов файлов с индексом 24

обновление: ответ 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, что в конечной точке к чему-то, что не является каталогом) (еще раз, не изменяя то конечное место назначения!)

Я обновлю, когда я нашел хороший путь к этому

2
23.11.2014, 17:02
2 ответа

Можно использовать

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
4
27.01.2020, 21:51

Здесь нет пункта вызова 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
4
27.01.2020, 21:51

Теги

Похожие вопросы