benutzerdefiniertes Dateisystem mit ausgefallenem Readdir- oder Bash-Vervollständigungsverhalten

benutzerdefiniertes Dateisystem mit ausgefallenem Readdir- oder Bash-Vervollständigungsverhalten

Ok. Nachdem ich ein paar Mal versucht habe, diese Frage zu formulieren, wird es wohl eine lange Frage werden. Wie auch immer:

Betrachten Sie diese Dateistruktur:

photos/ 
  ants/ 
    pic1.jpg
  animals/ 
    dog.png
  profile_pic.jpg

wenn Sie tun

cd photos
ls

du erhältst

ants/    animals/    profile_pic.jpg

Da die Verzeichnisse vacation und animals jedoch jeweils nur eine Datei enthalten, könnte es sinnvoller sein,

ants/pic1.jpg    ani../dog.png    profile_pic.jpg

direkt, anstatt jedes Tier und jeden Urlaub besuchen zu müssen. Bei der Tab-Vervollständigung möchten Sie jedoch wie bei CD A stattdessen Vorschläge der Verzeichnisse.

Ich weiß also, dass die Bash-Vervollständigung durch das Skript /etc/bash_completion (da will ich nicht weiter eingehen) und die Readline-Bibliothek gehandhabt wird, aber das hat keine wirklichen Auswirkungen auf ls und hilft sicherlich nicht, wenn Sie die Funktionalität auf Dateimanager wie Nautilus erweitern möchten. Daher hatte ich gehofft, dass einige dieser Probleme durch die Verwendung eines benutzerdefinierten Dateisystems über Fuse gelöst werden könnten. Eine erste Untersuchung basierend aufdieses Tutorialwar allerdings etwas deprimierend, da das Fuse-Dateisystem scheinbar in keiner Weise zwischen meinen unterschiedlichen Anwendungsfällen unterscheidet (jedes Mal readdir, opendir, releasedir).

Um eine Frage zu formulieren: Auf welche Weise könnte eine ähnliche Funktionalität erreicht werden, wenn dies überhaupt ohne größere Überarbeitung des Kernels möglich ist? Wo finde ich weitere Informationen?

Danke für Ihre Zeit!

BEARBEITEN: Zur Klarstellung: Bash ist ein nützliches Beispiel, aber letztendlich möchte ich, dass dies bei Nautilus und jedem anderen Programm, das auf die Dateien zugreift, dasselbe ist, und ich werde sowieso ein Dateisystem für andere Probleme schreiben.

Antwort1

Am einfachsten geht das, indem Sie ein Bash-Skript schreiben, das das für Sie erledigt. Ich bin mir ziemlich sicher, dass Sie das nicht in den Kernel oder das Dateisystem codieren wollen :)

Eine Logik wie diese sollte funktionieren:

In Verzeichnisse absteigen... Prüfen, ob eine Datei... Ordner/Datei drucken... sonst obersten Ordner drucken

Antwort2

Leider kann ich keinen Kommentar abgeben, also muss ich eine „Antwort“ schreiben (ich verstehe diese Entscheidung immer noch nicht, aber genug der Schimpftiraden). Da Sie die bashOption bereits verworfen und eine Lösung angedeutet haben FUSE, möchte ich Ihnen während der Umsetzung ein paar „mehr oder weniger praktikable“ Ideen geben mp3fs:

  • Verbesserung struct statmit einem neuen Typ, sagen wir st_nfiles. Jedes Mal, wenn Sie create()/symlink()/hardlink()eine Datei verwenden, aktualisieren Sie diesen Eintrag in den entsprechenden FUSEVorgängen. Um herauszufinden, ob es im referenzierten Verzeichnis nur einen Eintrag gibt, müssen Sie dann lediglich nachschlagen und (struct stat) dirp->st_nfilesmit 1 vergleichen. Sie benötigen LD_PRELOADeine Bibliothek in Ihrem Benutzerbereich, die die erforderlichen Aufrufe entführt und erweitert, um die Ergebnisse mit dieser Änderung printfauszugeben .stat

  • Missbrauch(struct stat) dirp->st_nlinkder in Ihrem FUSEOperationscode vorhandene getattr(). Der Nachteil könnten Probleme mit Tools sein, die von abhängen st_nlink; wenn ich mich richtig erinnere, findist dies eines davon. Dies erfordert auch eine globale LD_PRELOADBibliothek, um mit der Ausgabe herumzuspielen.

  • On-the-fly-Analyseim FUSEOperationscode von getattr(), ähnlich wie Sie es im reinen Benutzerbereich tun würden.DasDer Codeausschnitt sollte Ihnen eine Vorstellung geben.

Ich bin nicht sicher, ob das das ist, was Sie wollten. Ich wünschte, ich hätte dies als Kommentar hinzufügen können, anstatt als halbherzige Antwort. Vielleicht möchten Sie das bashTag aus dieser Frage entfernen, da Sie angegeben haben, dass dies für Sie nicht geeignet ist, da Sie möchten, dass sich Tools wie nautilusdiese genauso verhalten.

verwandte Informationen