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 bash
Option 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 stat
mit einem neuen Typ, sagen wirst_nfiles
. Jedes Mal, wenn Siecreate()/symlink()/hardlink()
eine Datei verwenden, aktualisieren Sie diesen Eintrag in den entsprechendenFUSE
Vorgängen. Um herauszufinden, ob es im referenzierten Verzeichnis nur einen Eintrag gibt, müssen Sie dann lediglich nachschlagen und(struct stat) dirp->st_nfiles
mit 1 vergleichen. Sie benötigenLD_PRELOAD
eine Bibliothek in Ihrem Benutzerbereich, die die erforderlichen Aufrufe entführt und erweitert, um die Ergebnisse mit dieser Änderungprintf
auszugeben .stat
Missbrauch
(struct stat) dirp->st_nlink
der in IhremFUSE
Operationscode vorhandenegetattr()
. Der Nachteil könnten Probleme mit Tools sein, die von abhängenst_nlink
; wenn ich mich richtig erinnere,find
ist dies eines davon. Dies erfordert auch eine globaleLD_PRELOAD
Bibliothek, um mit der Ausgabe herumzuspielen.On-the-fly-Analyseim
FUSE
Operationscode vongetattr()
, ä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 bash
Tag aus dieser Frage entfernen, da Sie angegeben haben, dass dies für Sie nicht geeignet ist, da Sie möchten, dass sich Tools wie nautilus
diese genauso verhalten.