Я не уверен, что на это можно ответить в целом, так как это проблема реализации. Конечно, ОС должна каким-то образом знать, что данный каталог является точкой монтирования, но разработчики ОС должны решить, как это сделать. Я понятия не имею о внутренностях, скажем, Linux, *BSD, Solaris или чего-то еще, и я бы не осмелился предположить какое-либо сходство или различие между ними.
Думаю, мы можем однозначно идентифицировать индекс по паре {device, inode} ( st_dev
и st_ino
в struct stat
). Предполагая, что жесткие ссылки на каталоги запрещены, индексный дескриптор каталога также будет иметь уникальное имя.
Следовательно, одним из способов было бы иметь таблицу всех точек монтирования в системе, которую ОС затем проверяла бы для каждого каталога при переходе по пути.
Если бы в системе был какой-то кеш для инодов (полезная оптимизация), мы могли бы пропустить поиск по полной таблице, добавив флаг или указатель в структуру инодов в памяти, чтобы узнать, inode является точкой монтирования или нет.
sed -e ':a;s/^\( *[^ _]*\)_/\1/;ta' data.genefile
Удаляет все _
из первого поля только во входном генефайле.
perl -F'(\s+)' -lne 'print map { /\S/ && !$a++ && s/_//g; $_ } @F' datagene.txt
-F'(\s+)'
=> FS
= один или несколько пробелов. Скобки изменяют поведение: теперь массив полей @F
содержит промежуточные пробелы, которые в обычном случае теряются. Мы делаем это, чтобы сохранить whitesoace до и после изменения. карта { ...Команда }
работает с элементами массива полей @F
один за другим, и применяется логическая логика, чтобы гарантировать, что обрабатывается только первое непустое поле. sed 'h;s/.*//;s/_//g;G;s/\n[^ ]*//'
Пояснение :h
копирует строку в пробел, первый s
удаляет все, кроме первого поля, второй делает нужную замену. Затем вы добавляете пробел с помощью G
и удаляете новую строку с первым полем. Сделанный.
awk '{ gsub("_", "", $1); print }'
Пояснение:
awk '{ for each line
gsub( globally replace
"_", "" underscore by the empty string
$1); in the first column
print and print the modified line
}'