Wie kann ich eine Dateisystemansicht eines Ordners erstellen, der bestimmte Dateien ausschließt?

7

Ich möchte einen Pfad im Dateisystem haben, der den gesamten Inhalt eines anderen Pfads anzeigt, mit Ausnahme einiger bestimmter Dateien meiner Wahl. Wenn beispielsweise Folgendes bereits vorhanden ist,

original-path
├── file1
├── file2
├── file3
├── file4
├── folder1
│   ├── file1
│   └── file2
└── folder2
    ├── file1
    └── file2

Ich möchte in der Lage sein , und von einem neuen Pfad auszuschließen /file1, der ansonsten auf dieselben Daten verweist:/folder1/file1/folder2

new-path
├── file2
├── file3
├── file4
└── folder1
    └── file2

Wie kann ich das erreichen? Eine Art Bind Mount, FUSE-Dateisystem oder ein cleveres Verknüpfungsschema?

ændrük
quelle

Antworten:

3

rofs-filtered , ein vom schreibgeschützten Dateisystem abgeleitetes FUSE-Dateisystem , kann Dateien mit regulären Ausdrücken ausschließen:

$ cat rofs-filtered.rc 
^/file1$
^/folder1/file1$
^/folder2$
$ rofs-filtered -c /home/ak/sandbox/rofs-filtered.rc /home/ak/sandbox/original-path /home/ak/sandbox/new-path
$ tree {original,new}-path
original-path
├── file1
├── file2
├── file3
├── file4
├── folder1
│   ├── file1
│   └── file2
└── folder2
    ├── file1
    └── file2
new-path
├── file2
├── file3
├── file4
└── folder1
    └── file2

rofs-gefiltert ist in Ubuntus Repositories nicht verfügbar, aber ich habe eine Anfrage gestartet , um es hinzufügen zu lassen .

ændrük
quelle
2

Ich denke du bist schon auf der richtigen Seite. Sie haben die beiden Dinge erwähnt, die ich vorgeschlagen hätte.

FUSE ist anscheinend ziemlich einfach zu stecken. Ich hatte vor einiger Zeit eine ähnliche Frage und eine der Antworten erwähnte FUSE. Ich habe eine einfachere Option gefunden (die ich gleich erläutern werde), aber wenn dies nicht wünschenswert ist, ist FUSE möglicherweise eine Untersuchung wert.

Mein Problem war, dass ich ein eingehendes Verzeichnis habe, in dem Clients alle Arten von Mist ausgeben. Ich brauchte einen Weg, um sie in tiefe Verzeichnisse sortieren zu können (z. B. /work/client-name/project/document.ext), aber ich hatte immer noch ein Verständnis auf höchster Ebene, um zu sehen, was neu war. Ich habe ein kleines Bash-Skript geschrieben, das ein "aktuelles" Verzeichnis enthält, das Symlinks zum aktuellen Inhalt enthält.

So etwas Einfaches könnte für Sie funktionieren. Verketten Sie einfach weiter mit -not -nameArgumenten oder filtern Sie positiv, wenn Sie etwas haben, nach dem Sie suchen können ...

#!/bin/bash

rm new-path/* # clean up old symlinks
find original-path -type d -maxdepth 1 -not -name folder2\
    -exec ln -s -t new-path/ {} +

Dies ist nur die erste Ebene, aber Sie können sie erweitern auf:

  • Suchen Sie nach den Verzeichnissen, die Sie spiegeln möchten
  • Erstellen Sie neue (echte) Verzeichnisse in new-path
  • Schleifen Sie die neuen Verzeichnisse und durchsuchen Sie die alten Versionen nach gewünschten Dateien, um Symlinks zu erstellen. Wie der ursprüngliche Fund mit einer gewissen Erweiterung der Pfade.
  • Die anfängliche Bereinigungsanweisung muss auch sein, rm -rf new-path/*weil sie echte Verzeichnisse sind. Sei vorsichtig damit.
Oli
quelle