Это - просто плохая идея, поскольку нет никакого способа сказать различие между жесткой ссылкой и настоящим именем.
Разрешение жестких ссылок на каталоги повредило бы направленную структуру графа без петель файловой системы, возможно создав циклы каталога и повисшие поддеревья каталога, которые сделают fsck
и любые другие подверженные ошибкам ходоки дерева файла.
Во-первых, для понимания этого давайте говорить о inodes. Данные в файловой системе сохранены в блоках на диске, и те блоки собраны вместе inode. Можно думать о inode как о файле. Inodes испытывают недостаток в именах файлов, все же. Это - то, где ссылки входят.
Ссылка является просто указателем на inode. Каталог является inode, который содержит ссылки. Каждое имя файла в каталоге является просто ссылкой на inode. Открытие файла в Unix также создает ссылку, но это - другой тип ссылки (это не именованная ссылка).
Жесткая ссылка является просто дополнительной записью каталога, указывающей на это inode. Когда Вы ls -l
, число после полномочий является именованным числом каналов. Большинство регулярных файлов будет иметь одну ссылку. Создание новой жесткой ссылки на файл заставит оба имен файлов указать на тот же inode.Примечание:
% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r-- 1 danny staff 0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
-rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
^
^ this is the link count
Теперь, можно ясно видеть, что нет такой вещи как жесткая ссылка. Жесткая ссылка совпадает с регулярным именем. В вышеупомянутом примере, test
или test2
, который является исходным файлом и который является жесткой ссылкой? К концу Вы не можете действительно сказать (даже метками времени), потому что оба имени указывают на то же содержание, тот же inode:
% ls -li test*
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
14445892 -rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
-i
флаг к ls
шоу Вы inode числа в начале строки. Отметьте как test
и test2
имейте то же inode число, но test3
имеет другой.
Теперь, если бы Вам разрешили сделать это для каталогов, то два различных каталога в различных точках в файловой системе могли указать на то же самое. На самом деле subdir мог указать назад своему прародителю, создав цикл.
Почему этот цикл является беспокойством? Поскольку, когда Вы пересекаете, нет никакого способа обнаружить Вас, цикличное выполнение (не отслеживая inode числа, поскольку Вы пересекаете). Предположите, что Вы пишете du
команда, которая должна рекурсивно вызвать через subdirs для обнаружения об использовании диска. Как был бы du
знайте, когда это поразило цикл? Это подвержено ошибкам и большая бухгалтерия это du
должен был бы сделать, только для осуществления этой простой задачи.
Символьные ссылки являются совершенно другим зверем, в этом они - специальный тип "файла", за которым много API файловой системы файла имеют тенденцию автоматически следовать. Отметьте, символьная ссылка может указать несуществующему месту назначения, потому что они указывают по имени, и не непосредственно к inode. То понятие не имеет смысла с жесткими ссылками, потому что простое существование "жесткой ссылки" означает, что файл существует.
Итак, почему может du
соглашение с символьными ссылками легко и не жесткими ссылками? Мы смогли видеть выше этого, жесткие ссылки неотличимы от нормальных записей каталога. Символьные ссылки, однако, являются особенными, обнаруживаемыми, и skippable! du
уведомления, что символьная ссылка является символьной ссылкой и пропускает ее полностью!
% ls -l
total 4
drwxr-xr-x 3 danny staff 102 Oct 13 18:14 test1/
lrwxr-xr-x 1 danny staff 5 Oct 13 18:13 test2@ -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .
Я обычно использую этот стиль команды для выполнения grep
по многим файлам:
find / -xdev -type f -print0 | xargs -0 grep -H "800x600"
То, что это на самом деле делает, входят в список каждого файла в системе, и затем для каждого файла, выполняются grep
с данными аргументами и названием каждого файла.
-xdev
аргумент говорит, находят, что он должен проигнорировать другие файловые системы - это хорошо для предотвращения специальных файловых систем такой как /proc
. Однако это также проигнорирует нормальные файловые системы также - поэтому, если, например, Ваш / домашняя папка будет на другом разделе, то это не будет искаться - необходимо было бы сказать find / /home -xdev ...
.
-type f
поиск средств регистрирует только, таким образом, каталоги, устройства и другие специальные файлы проигнорированы (он все еще рекурсивно вызовет в каталоги и выполнится grep
на файлах в - это просто не выполнится grep
на самом каталоге, который не работал бы так или иначе). И -H
опция к grep
говорит этому всегда печатать имя файла в своем выводе.
find
принимает все виды опций отфильтровать список файлов. Например, -name '*.txt'
процессы только файлы, заканчивающиеся в .txt. -size -2M
файлы средств, которые меньше, чем 2 мегабайта. -mtime -5
файлы средств изменяются за прошлые пять дней. Присоединитесь к ним вместе с-a для и и-o для или, и использование '('
круглые скобки ')'
к выражениям группы (в кавычках, чтобы препятствовать тому, чтобы оболочка интерпретировала их). Так, например:
find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"
Смотрите на man find
видеть полный список возможных фильтров.
Обычно Вы не хотели бы на самом деле искать ВСЕ в системе. Linux использует узлы файла для всего, таким образом, некоторые "файлы" не являются вещами, Вы хотели бы искать. Например, /dev/sda
физическое блочное устройство для Вашего первого жесткого диска. Вы, вероятно, хотите искать смонтированные файловые системы не устройство неструктурированного диска. Также существует /dev/random
который выкладывает случайные данные каждый раз, когда Вы читаете их. Поиск, который не имеет большой смысл. /proc
файловая система также проблематична в Вашем случае.
Я рекомендовал бы одну из двух вещей.
Не ищите в корне, только ищите места, которые могли бы быть полезными. Поиск /home
или /usr
или /etc
separatly. Информация, которую Вы ищете, вероятно, имеет определенный тип, таким образом, это, вероятно, будет в определенной папке так или иначе. Параметры конфигурации должны быть в /etc
. Ваши файлы персональных данных должны быть в /home
. Ограничение поиска к главной области как это значительно уменьшит Ваши проблемы с рекурсивными властями.
Исключите проблематичное использование областей --exclude-dir
и ряд вещей, Вы знаете Вас, не делает подобный потребности это:
grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found
Наконец, весьма распространено натыкаться на несколько 'отклоненных разрешением' ошибок при выполнении большого рекурсивного grep. В нормальном ходе использования существуют файлы, которые Ваш пользователь не может читать. Пока это всего несколько нечетных файлов и не вещей как неструктурированное устройство для Ваших жестких дисков или всей proc файловой системы, нормально просто игнорировать ошибки. На самом деле можно сделать это на командной строке путем отправки всех ошибок в никогда никогда землю:
grep -r search_string /path 2> /dev/null
Для простоты я предложил бы ack-grep. Ссылка показывает много случаев когда ack-grep
более оптимальный вариант.
Использовать после установки:
ack-grep pattern /
просто правильно-
grep -r "800x600" /
-Что не так в вашей текущей команде, так это кавычки "". Всегда помещайте строковый аргумент для grep
в кавычки.
Другой способ взглянуть на это так:
grep -r /* | grep "800x600"
* затем я получаю триггер /proc/sysrq -:Ошибка ввода/вывода
Ваша команда работает. Вы получаете эту ошибку, потому что пытаетесь сканировать запущенные процессы на наличие строки.
Я рекомендую исключать системные каталоги с
grep --exclude-dir={proc,sys} "800x600" /
Если вы хотите запустить поиск текста только в файлах, соответствующих определенному шаблону имени (, например. .txt
файлы )можно сделать:
grep -rlw --include="*.txt" -e "text to search" path/to/dir
Опустите параметр w
, если вы также хотите найти файлы, в которых искомый текст является подстрокой содержимого файла.
-xdev
исключит все другие файловые системы, не только специальные. (например, если Вы имеете/home
смонтированный как отдельный раздел, это не будет искаться.) – cjm 06.07.2011, 11:29find: paths must precede expression: /
– Level1Coder 06.07.2011, 11:36xargs
с, возможно, лучшей эффективностью путем выполненияfind / -xdev -type f -exec grep -H '800x600' +
. – Totor 26.01.2014, 03:31+
знак в концеfind
команда на самом деле делает то же самое какxargs
: это порождает тотgrep
процесс с несколькими аргументами. – Totor 27.01.2014, 14:58