сценарий оболочки, чтобы найти все файлы в / et c по крайней мере с 7 жесткими ссылками - PullRequest
0 голосов
/ 23 февраля 2020

Используя стандартные инструменты UNIX (grep, awk, встроенные оболочки и т. Д. c), мне нужно вывести любой файл, содержащий не менее 7 жестких ссылок в каталоге / et c. Любая помощь с этим будет оценена.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2020

Я думаю, что вопрос некорректен и представляет неправильное представление о том, что в /etc вообще есть какие-либо файлы. /etc является каталогом, и поэтому не содержит файлов . Он содержит только имена, которые являются ссылками на файлы. Возможно, короткий ответ на вопрос так же прост:

ls -ila /etc | awk '$3 > 7'

, в котором будут перечислены любые имена в / et c, которые ссылаются на файл с 7 или более ссылками, но, безусловно, есть нет никакой гарантии, что все эти ссылки находятся в / et c. Я подозреваю, что вопрос должен быть сформулирован как «перечислить любой файл, имеющий ссылку в / et c, который содержит как минимум 7 ссылок», и в этом случае я бы дал ответ:

for i in /etc/*; do stat -c '%h %i' "$i"; done |
     awk '$1 > 7{a[$2]++} END {for (node in a) print node}'

Или, если вы просто хотите перечислить все ссылки в / et c, выполните:

for i in /etc/*; do stat  -c '%h %n' "$i"; done | awk '$1 > 7'

Используйте find Если вы хотите сделать это рекурсивно.

0 голосов
/ 23 февраля 2020

К сожалению, find не имеет предиката для этого, так что в конечном итоге вам нужно выполнить свою собственную фильтрацию. Предполагая, что у вас есть версия GNU find, он может выводить счетчик ссылок, даже если он не может фильтровать его самостоятельно:

#!/usr/bin/env bash
#              ^^^^- NOT /bin/sh; we need the ability to tell read to stop on a NUL.
while IFS= read -r -d ' ' link_count && IFS= read -r -d '' filename; do
  (( link_count >= 7 )) && printf '%q\n' "$filename"
done < <(find /etc -printf '%n %p\0')

Чтобы ответить на некоторые вероятные вопросы, касающиеся вышеупомянутого:

  • Что с печатями -printf '%n %p\0'?
    • %n Hardlink.
    • %P печатает имя файла, который был найден.
    • \0 печатает символ NUL - единственный символ, который гарантированно не является частью имени файла , и который таким образом, безопасно разделять их (в именах файлов могут быть новые строки, поэтому разделенные новыми строками списки имен могут вводить в заблуждение!)
  • Что с синтаксисом (( link_count >= 7 ))? - См. арифмети c выражение в вики bash -хакеров.
  • Что с printf '%q\n' "$filename"? - Он печатает имена в понятный человеку способ, позволяющий избежать любых символов, которые нельзя распечатать (табуляции, пробелы, переводы строк и т. д. c) - и , которые вы можете n скопируйте и вставьте в приглашение bash ссылку на тот же файл.
  • Почему while read l oop? - См. BashFAQ # 1 .
  • Почему read -d ' ', а затем read -d ''? - Аргумент -d для read заставляет его остановиться, когда он видит первый символ последующего аргумента. read -d ' ' велит ему остановиться, когда увидит пробел; read -d '' говорит ему остановиться, когда он видит NUL (поскольку строка длиной 0 C содержит один символ - терминатор NUL).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...