Пользовательская файловая система с необычным поведением 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 вести себя так же.

Другие вопросы по тегам