Как подсчитать общее количество жестких ссылок в каталоге?

объединение ответ для tail:

tail -f file | sed 's/\\n/\n/g'

с опцией -l в multitail:

multitail -l "tail -f file | sed 's/\\\n/\\n/g'"

обратите внимание: дополнительный escape на \n

дополнительная подсказка:
(раскрасит все файлы и объединит их в одно окно multitail):

multitail -C fileUNfiltered -L "tail -f file | sed 's/\\\n/\\n/g'"

1
10.11.2018, 06:24
4 ответа
ls -qAi | awk '{print $1}' | sort | uniq -d | wc -l

Это подсчитывает иноды, которые дублируются в текущем каталоге(по одному, замените -dна -Dдля подсчета всех вхождений ), поэтому не считая жестких ссылок, где все остальные ссылки живут вне текущего каталога. .и ..исключены. Замените -Aна -a, чтобы добавить их обратно (, хотя очень маловероятно, что они все равно будут иметь жесткие ссылки в текущем каталоге ).

Может быть и более короткий путь, но это очень показательно.

Мистер Пайп |— ваш друг.

(manтоже)

Удачи!

2
28.04.2021, 23:40

Учитывая среду Linux, вы можете использовать команду statдля каждого файла и запрашивать количество ссылок. Вы можете решить, хотите ли вы включить или исключить файлы с точкой -из подсчета с помощью shopt -s dotglob. В приведенном ниже цикле я намеренно пропускаю каталоги.

shopt -s dotglob
i=0
for f in./*
do
  [ -d "$f" ] && continue
  if [ $(stat -c %h "$f") -gt 1 ]
  then
    i=$((i+1))
  fi
done

В качестве альтернативы, с помощью GNU find:

find. -maxdepth 1 \! -type d -links +1 -printf. | wc -c

Это запрашивает findпоиск, начиная с текущего каталога(.):

  • только в текущем каталоге(-maxdepth 1)
  • пропуск каталогов (! -type d, где !экранирован из оболочки)
  • если количество ссылок больше 1
  • в этом случае выведите точку(.)
  • ... и затем посчитайте количество испущенных периодов
1
28.04.2021, 23:40

Сzsh:

(){echo $#} *(NDl+1)

Обратите внимание, что здесь не учитываются .и ...

Если вы не хотите считать каталоги (, которые в большинстве файловых систем всегда являются жесткими ссылками ), измените на *(NDl+1^/).

  • (){echo $#}анонимная функция, которая выводит количество аргументов
  • *(...)глобус с квалификаторами глобус
  • N:включить nullglobдля этого глобуса (расширить до нуля, если совпадений нет)
  • D:включить dotglobдля этого шара (включает скрытые файлы, но никогда .и..)
  • l+1:выбирать файлы с количеством ссылок строго больше 1.
  • ^/:исключить файлы типа каталог .

Эквивалент POSIX:

find.//. ! -name. -prune -links +1 | grep -c //

(добавьте ! -type dпосле -prune, чтобы исключить каталоги ).

Или сls:

(export LC_ALL=C; ls -Aqn | awk 'NR > 1 && $2 > 1 {n++}; END {print n}')

Чтобы исключить каталоги, добавьте && $1 !~ /^d/после $2 > 1.

4
28.04.2021, 23:40

Я использовал следующую строку -, чтобы найти файл с наибольшим количеством жестких ссылок:

find. -type f -exec ls -l {} \; | sort -nrk 2 | head -n 1

Надеюсь, это поможет всем, кто ищет то же самое.

0
29.06.2021, 01:21

Теги

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