3

Хорошо. После нескольких попыток сформулировать этот вопрос выясняется, что этот вопрос будет долгим. 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 ответа2

1

Самый простой способ сделать это - написать скрипт bash, который сделает это за вас. Я вполне уверен, что вы не захотите кодировать это в ядро или файловую систему :)

Такая логика должна работать:

Сходи в каталоги ... Проверьте, если один файл ... распечатать папку / файл ... иначе распечатать верхнюю папку

1

К сожалению, я не могу оставить комментарий, поэтому я должен написать "ответ" (я все еще не понимаю это решение, но достаточно разглагольствования). Поскольку вы уже отказались от опции 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 вели себя так же.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .