Пользовательская файловая система с необычным поведением readdir или bash
Хорошо. После нескольких попыток сформулировать этот вопрос выясняется, что этот вопрос будет долгим. Anywho:
Рассмотрим эту файловую структуру:
photos/
ants/
pic1.jpg
animals/
dog.png
profile_pic.jpg
если вы делаете
cd photos
ls
ты получаешь
ants/ animals/ profile_pic.jpg
Однако, поскольку каталоги "Отпуск" и "Животные" содержат только один файл каждый, возможно, было бы более полезно получить
ants/pic1.jpg ani../dog.png profile_pic.jpg
непосредственно, в отличие от необходимости посещения каждого из животных и отдыха. Однако при завершении вкладки, как и в cd a, вы захотите предложить каталоги.
Так что я знаю, что завершение bash выполняется скриптом / etc / bash_completion (я не хочу туда идти) и библиотекой readline, но это не очень влияет на ls и, конечно, не поможет, если вы хотите расширить функциональность до файла. Менеджеры такие наутилус. Поэтому я надеялся, что с этим можно справиться, используя нестандартную файловую систему поверх предохранителя. Первоначальное исследование, основанное на этом руководстве, было несколько удручающим, поскольку файловая система fuse, похоже, никоим образом не различает мои разные варианты использования (readdir, opendir, releaseir каждый раз).
Сформулировать вопрос: каким образом можно подобрать аналогичную функциональность, если это вообще возможно без серьезной доработки в ядре? Где мне искать дополнительную информацию?
Спасибо за ваше время!
РЕДАКТИРОВАТЬ: Чтобы уточнить, bash является полезным примером, но в конце я хочу, чтобы это было то же самое с помощью nautilus и любой другой программы, обращающейся к файлам, и я все равно напишу файловую систему для других проблем.
2 ответа
Самый простой способ сделать это - написать скрипт bash, который сделает это за вас. Я вполне уверен, что вы не захотите кодировать это в ядро или файловую систему:)
Такая логика должна работать:
Спуск в каталоги... Проверьте, если один файл... распечатать папку / файл... иначе распечатать верхнюю папку
К сожалению, я не могу оставить комментарий, поэтому я должен написать "ответ" (я все еще не понимаю это решение, но достаточно разглагольствования). Поскольку вы уже отказались от bash
вариант и намекнул в сторону FUSE
Решение, я хотел бы дать вам пару "более или менее жизнеспособных" идей, пока вы реализуете mp3fs
:
Повышение
struct stat
с новым типом, скажемst_nfiles
, Каждый раз, когда выcreate()/symlink()/hardlink()
файл, вы будете обновлять эту запись в соответствующемFUSE
операции. Выяснение, если в упомянутом каталоге есть только одна запись, будет просто поиск и сравнение(struct stat) dirp->st_nfiles
с 1. Вам нужно будетLD_PRELOAD
библиотека для вашего пользовательского пространства, которая захватывает и расширяет необходимыеprintf
призывает к выводуstat
результаты с этим изменением.Неправильное использование существующих
(struct stat) dirp->st_nlink
в вашемFUSE
код операцииgetattr()
, Недостатком могут быть проблемы с инструментами, которые зависят отst_nlink
; если я правильно помню,find
это один из них. Это также нуждается в глобальномLD_PRELOAD
библиотека, чтобы возиться с выходом.На лету разбор в
FUSE
код операцииgetattr()
аналогично тому, что вы делаете в чистом пространстве пользователя. Этот фрагмент кода должен дать вам идею.
Не уверен, хотел ли ты этого. Я хотел бы добавить это в качестве комментария, а не полуобеспеченного ответа. Может быть, вы хотите удалить bash
отметьте этот вопрос, поскольку вы указали, что он вам не подходит, поскольку вам нужны такие инструменты, как nautilus
вести себя так же.