web-dev-qa-db-fra.com

Comment créer un système de fichiers "vue" d'un dossier qui exclut certains fichiers?

Je veux avoir un chemin dans le système de fichiers qui montre le contenu entier d'un autre chemin, à l'exception de certains fichiers de mon choix. Par exemple, si ce qui suit existe déjà,

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

Je veux pouvoir exclure /file1, /folder1/file1 et /folder2 d'un nouveau chemin qui renvoie par ailleurs aux mêmes données:

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

Comment puis-je accomplir cela? Une sorte de montage de liaison, de système de fichiers Fuse ou de schéma de liaison intelligent?

7
ændrük

rofs-filter , un système de fichiers Fuse dérivé de système de fichiers en lecture seule , peut exclure des fichiers à l'aide d'expressions régulières:

$ 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-filter n'est pas disponible dans les dépôts d'Ubuntu, mais j'ai lancé un demande de l'ajout .

3
ændrük

J'ai trouvé ça:

Cmdfs est un système de fichiers virtuel Fuse qui applique une commande de filtre arbitraire aux fichiers sélectionnés dans une arborescence de répertoires source afin de créer les fichiers de destination.

Voici un article à ce sujet: http://www.linux-magazine.com/Online/Features/Cmdfs

Et la source sur github: https://github.com/mikeswain/cmdfs

2
Rolf

Je pense que vous êtes déjà sur la bonne page. Vous avez mentionné les deux choses que j'aurais suggérées.

Fuse est apparemment assez simple à prendre. J'ai eu une question similaire à celle-ci il y a quelque temps et l'une des réponses a mentionné Fuse. J'ai trouvé une option plus simple (que j'expliquerai dans une seconde), mais si cela n'est pas souhaitable, Fuse pourrait valoir la peine d'être étudié.

Mon problème était que j'ai un répertoire entrant où les clients jettent toutes sortes de conneries. J'avais besoin d'un moyen pour être autorisé à les trier dans des répertoires profonds (par exemple, /work/client-name/project/document.ext), mais j'ai toujours une compréhension au plus haut niveau pour voir ce qui était nouveau. J'ai écrit un petit script bash qui maintenait un répertoire "récent" contenant des liens symboliques vers le contenu récent.

Quelque chose d'aussi simple que cela pourrait fonctionner pour vous. Continuez simplement à vous enchaîner sur les arguments -not -name, ou filtrez positivement si vous avez quelque chose que vous pouvez rechercher ...

#!/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/ {} +

Ceci est seulement le premier niveau mais vous pouvez l’étendre à:

  • Recherchez les annuaires que vous vouliez mettre en miroir
  • Créer de nouveaux répertoires (réels) dans new-path
  • Bouclez les nouveaux répertoires et recherchez dans les anciennes versions les fichiers de votre choix, en créant des liens symboliques. Comme la découverte originale avec une augmentation des chemins.
  • L'instruction de nettoyage initiale devra également être rm -rf new-path/*, car ce sont de vrais répertoires. Faites attention avec ça.
2
Oli