Bonjour,
J'utilise Nextcloud pour mon activité professionnelle, via un navigateur. Je suis assez embêté par l'absence d'une fonction qui me paraît essentielle lors d'une recherche de fichier : ouvrir le dossier. Simplement.
L'objectif est d'ouvrir le dossier du résultat de la recherche, au lieu d'ouvrir le fichier lui-même. Cela m'est nécessaire pour trois cas d'usages :
1. Je dois consulter / copier / manipuler plusieurs fichiers qui sont dans le même dossier
2. Je dois ajouter un fichier / dossier dans le dossier contenant le fichier, mais je ne sais pas où est dans l'arborescence
3. Je ne me souviens plus du nom du fichier que je cherche, mais je me souviens d'un autre fichier qui est dans le même dossier.
Comme je n'ai rien trouvé de pertinent sur le web, j'ai demandé à Claude :
J'utilise nextcloud à partir d'un navigateur web. Lorsque je cherche un fichier, je souhaite pouvoir visualiser le dossier dans lequel il est stocké. Sur le même modèle que "Ouvrir l'emplacement de l'élément" que j'ai avec nautilus.
Voici sa réponse :
Malheureusement, la recherche native de Nextcloud (via la barre de recherche en haut) n'offre pas de bouton "ouvrir le dossier parent" dans les résultats. Voici les options selon ton niveau de confort :
Option 1 — Extension navigateur : Nextcloud Cospend / scripts utilisateur (Greasemonkey/Tampermonkey)
Tu peux installer un userscript via Tampermonkey qui ajoute un lien "Ouvrir le dossier" sur chaque résultat de recherche. C'est la solution la plus proche de "Ouvrir l'emplacement" de Nautilus.
Cherche sur Greasy Fork : Nextcloud Files open folder.Option 2 — Utiliser l'application Files + le chemin dans l'URL
Quand un résultat de recherche apparaît, tu peux cliquer droit → Copier le lien sur le fichier, puis modifier l'URL manuellement :URL d'un fichier : …/apps/files/?dir=/MonDossier/SousDossier&scrollto=monfichier.pdf
Le paramètre dir= contient exactement le chemin du dossier parent — il suffit de le garder et de supprimer &scrollto=…C'est manuel mais ça fonctionne immédiatement sans rien installer.
Je tiens à préciser que ne suis pas développeur et que je n'ai absolument aucune connaissance dans ce domaine. La réponse de Claude m'a donc surpris, car je ne suis pas du tout le public cible à ce type de proposition. De plus, je n'ai jamais demandé d'aide à Claude à ce sujet, ce qui aurait pu favoriser une telle réponse. Néanmoins, j'ai installé un des gestionnaires de script dans Firefox, copier/coller le résultat, suivi les instructions présentées et… recommencé quelques fois, cinq exactement (coucou la console du navigateur F12 !)
Maintenant cela fonctionne et je suis tout content. Je vais pouvoir passer moins de temps dans mes recherches sur Nextcloud.
L'objectif de ce journal n'est pas tant de publier le résultat que tout le monde peut reproduire facilement, mais pour faire part de possibilités que je n'envisageai pas du tout jusqu'à présent. Cela ouvre de nouvelles perspectives.
Je publie le résultat ici, puisque cela pourra éventuellement aider d'autres personnes.
// ==UserScript==
// @name Nextcloud – Ouvrir le dossier parent
// @version 1.0.5
// @description Ajoute un bouton "Ouvrir le dossier" sur chaque résultat de recherche Nextcloud 32
// @author Claude / Anthropic
// @match *://*/*
// @grant none
// @run-at document-idle
// ==/UserScript==
(function () {
'use strict';
function isNextcloud() {
return !!(
document.querySelector('#unified-search') ||
document.querySelector('meta[name="apple-itunes-app"][content*="1125420102"]')
);
}
if (!isNextcloud()) return;
const origin = window.location.origin;
// -----------------------------------------------------------------------
// Styles
// -----------------------------------------------------------------------
const style = document.createElement('style');
style.textContent = `
.nc-folder-btn {
display: inline-flex;
align-items: center;
gap: 5px;
margin-left: 8px;
padding: 2px 8px;
border-radius: 4px;
font-size: 12px;
font-family: inherit;
color: var(--color-primary-element, #0082c9);
background: var(--color-primary-element-light, rgba(0,130,201,0.1));
border: 1px solid var(--color-primary-element, #0082c9);
cursor: pointer;
white-space: nowrap;
vertical-align: middle;
opacity: 0.9;
transition: opacity 0.15s;
}
.nc-folder-btn:hover { opacity: 1; }
.nc-folder-btn svg { flex-shrink: 0; }
.nc-folder-btn--loading { opacity: 0.5; cursor: wait; }
`;
document.head.appendChild(style);
const FOLDER_ICON = `<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>`;
// -----------------------------------------------------------------------
// Helpers
// -----------------------------------------------------------------------
function getRequestToken() {
return document.head.dataset.requesttoken || '';
}
function getUser() {
return document.head.dataset.user || '';
}
// Encode chaque segment du chemin séparément pour préserver les "/"
function encodePath(path) {
return path.split('/').map(segment => encodeURIComponent(segment)).join('/');
}
// -----------------------------------------------------------------------
// Cache et résolution du chemin via WebDAV SEARCH
// -----------------------------------------------------------------------
const pathCache = {};
async function getFilePath(fileId) {
if (pathCache[fileId] !== undefined) return pathCache[fileId];
const user = getUser();
const body = `<?xml version="1.0"?>
<d:searchrequest xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">
<d:basicsearch>
<d:select><d:prop><d:displayname/><oc:fileid/></d:prop></d:select>
<d:from><d:scope><d:href>/files/${user}</d:href><d:depth>infinity</d:depth></d:scope></d:from>
<d:where><d:eq><d:prop><oc:fileid/></d:prop><d:literal>${fileId}</d:literal></d:eq></d:where>
</d:basicsearch>
</d:searchrequest>`;
try {
const resp = await fetch(`${origin}/remote.php/dav`, {
method: 'SEARCH',
headers: {
'Content-Type': 'application/xml',
'Depth': '0',
'requesttoken': getRequestToken(),
},
body,
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const xml = await resp.text();
const doc = new DOMParser().parseFromString(xml, 'application/xml');
const href = doc.querySelector('response > href')?.textContent?.trim();
if (!href) throw new Error('href vide');
// href est retourné encodé par le serveur
// On décode complètement, puis on re-encodera segment par segment au moment de construire l'URL
const prefix = `/remote.php/dav/files/${user}/`;
// Décoder le href entier pour obtenir le chemin lisible
let decoded;
try {
decoded = decodeURIComponent(href);
} catch(e) {
decoded = href; // fallback si déjà décodé ou mal encodé
}
const decodedPrefix = `/remote.php/dav/files/${user}/`;
const relativePath = decoded.startsWith(decodedPrefix)
? decoded.slice(decodedPrefix.length)
: decoded;
// Déterminer le dossier parent (tout sauf le dernier segment)
const lastSlash = relativePath.lastIndexOf('/');
const dir = lastSlash > 0 ? '/' + relativePath.substring(0, lastSlash) : '/';
pathCache[fileId] = dir;
return dir;
} catch (e) {
console.warn('[NC-folder] SEARCH échoué :', e);
pathCache[fileId] = null;
return null;
}
}
// -----------------------------------------------------------------------
// Construire l'URL du dossier avec encodage correct segment par segment
// -----------------------------------------------------------------------
function buildFolderUrl(dir) {
// dir est un chemin décodé
// On encode chaque segment séparément
const encodedDir = encodePath(dir);
return `${origin}/apps/files/?dir=${encodedDir}`;
}
// -----------------------------------------------------------------------
// Traiter une ligne de résultat
// -----------------------------------------------------------------------
function processRow(row) {
if (row.dataset.ncFolderDone) return;
row.dataset.ncFolderDone = '1';
const fileId = row.dataset.cyFilesListRowFileid;
if (!fileId) return;
const nameCell = row.querySelector('[data-cy-files-list-row-name]');
if (!nameCell) return;
const btn = document.createElement('button');
btn.className = 'nc-folder-btn nc-folder-btn--loading';
btn.innerHTML = FOLDER_ICON + ' <span>…</span>';
btn.title = 'Chargement du chemin…';
btn.type = 'button';
nameCell.appendChild(btn);
getFilePath(fileId).then(dir => {
if (!dir) { btn.remove(); return; }
btn.classList.remove('nc-folder-btn--loading');
btn.innerHTML = FOLDER_ICON + ' <span>Ouvrir le dossier</span>';
btn.title = `Aller dans : ${dir}`;
btn.addEventListener('click', e => {
e.stopPropagation();
window.location.href = buildFolderUrl(dir);
});
});
}
// -----------------------------------------------------------------------
// Détecter si une recherche est active
// -----------------------------------------------------------------------
function isSearchActive() {
const input = document.querySelector('input[type="search"]');
return input && input.value.trim().length > 0;
}
// -----------------------------------------------------------------------
// Scanner les lignes
// -----------------------------------------------------------------------
function scan() {
if (!isSearchActive()) return;
document.querySelectorAll(
'tr[data-cy-files-list-row-fileid]:not([data-nc-folder-done])'
).forEach(processRow);
}
// -----------------------------------------------------------------------
// Observer le DOM
// -----------------------------------------------------------------------
let debounce;
const observer = new MutationObserver(() => {
clearTimeout(debounce);
debounce = setTimeout(scan, 200);
});
observer.observe(document.body, { childList: true, subtree: true });
scan();
})();
# Ce journal est inutile
Posté par Laurent Pointecouteau (site web personnel, Mastodon) . Évalué à 7 (+14/-9).
J'ai cliqué sur "Ce journal est inutile", car il se résume à un copié-collé d'une réponse Claude. Je suis d'avis que de tels journaux ne méritent pas d'être rédigés.
[^] # Re: Ce journal est inutile
Posté par Axone . Évalué à 10 (+11/-2).
J'ai trouvé au contraire ce partage d'expérience de résolution d'une problématique intéressant.
[^] # Re: Ce journal est inutile
Posté par Voltairine . Évalué à 5 (+6/-3).
C'est lapidaire mais j'approuve.
Je ne vais pas discuter de la forme du script auto-généré mais plutôt de la méthode employée pour résoudre un problème.
La solution, si c'en est une, ne va bénéficier qu'à l'auteur de journal et éventuellement à une ou deux lectrices qui auraient le même besoin.
La bonne démarche aurait été de commencer par chercher dans les applications tierces de Nextcloud, puis dans les tickets ouverts sur Github. Et finalement de faire un signalement demandant l'ajout de fonctionnalités(*) dans la fenêtre de résultat de recherche : ouvrir le dossier, télécharger le fichier, etc.
(*)N.B. : Nextcloud n'ouvre que les fichiers qu'il sait afficher ou lire (images par exemple), sinon on tombe directement dans le dossier et c'est aussi le cas immédiatement après avoir fermé le fichier.
[^] # Re: Ce journal est inutile
Posté par dark_moule . Évalué à 8 (+9/-2).
Je n'ai pas détaillé, mais dans le passage "Comme je n'ai rien trouvé de pertinent sur le web, j'ai demandé à Claude", je confirme avoir cherché dans la documentation un éventuel paramètre à activer, une évolution dans une version future, une extension, un ticket qu'il soit ouvert ou clos, etc. N'ayant rien trouvé à part des commentaires pour dire que ce n'était effectivement pas possible (ou complètement hors sujet), je me suis résigné à demander à Claude dans l'espoir qu'il identifie justement une extension ou un ticket que je n'aurai pas vu. Bref, quelque chose d'existant quelque part.
De façon surprenante, il a proposé de développer un script sur mesure pour personnaliser un logiciel. C'était de mon point de vue totalement inattendu et totalement en dehors de mes compétences, alors j'ai été très surpris. Je ne m'attendais pas du tout à cette réponse.
Je trouve que c'est une façon nouvelle de résoudre des problèmes plutôt que de dépendre de tierces personnes en espérant qu'elles aient la volonté de faire, éventuellement un jour. Là cela donne une autonomie à des utilisateurs complètement étranger à la programmation, ce qui est plaisant.
Cette proposition de résoudre un problème de cette façon peut amener d'autres utilisateurs comme moi à "hacker" un logiciel utilisé au quotidien, alors je trouvais que cela pouvait être un retour d'expérience intéressant.
[^] # Re: Ce journal est inutile
Posté par potate . Évalué à 7 (+7/-1). Dernière modification le 20 avril 2026 à 20:27.
Ça me parait imprudent. Un utilisateur qui est complétement étranger à la programmation ne va pas s'assurer que le script qu'il exécute fait ce qui est attendu et pas autre chose, comme par exemple importer du code externe de façon hasardeuse ou faire du nettoyage de données avec un peu de zèle.
[^] # Re: Ce journal est inutile
Posté par gUI (Mastodon) . Évalué à 9 (+7/-1).
C'est fini ça, plus besoin de relire. Tu le fais analyser par une IA et elle t'expliquera bcp mieux ce que fait ou pas le code.
Je ne rigole qu'à moitié, une extension Firefox qui relit tout ce que t'essaies d'installer pour te dire "oulah malheureux, ça pue ce truc !" ce sera toujours bcp plus efficace que de ne pas relire du tout les extensions (me faites pas croire que vous lisez les extensions avant de les installer).
Et si par hasard vous me dites "ah mais si ! moi je relis" alors allez aider FreeBSD et autres qui se font déterrer des CVE régulièrement (ça devient presque un benchmark d'IA) alors que tout plein de gens avaient relu avant.
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: Ce journal est inutile
Posté par Faya . Évalué à 5 (+4/-1).
On est bien sur un site dédié aux logiciel libres là ? Oui soumettre une demande au projet c'est le step1 mais après, pourquoi ne pas faire comme Stallman et son imprimante : essayer de régler le soucis soi-même. Qui sait, la prochaine fois
dark_moulepourrait peut-être soumettre un patch à Nextcloud (le script actuel ne conviendra pas puisqu'il est local, Claude aurait dû lui proposer de l'accompagner pour écrire un patch et le soumettre).[^] # Re: Ce journal est inutile
Posté par barmic 🦦 . Évalué à 1 (+2/-3).
J'ai cliqué sur inutile parce que tu es contre la culture hacker.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: Ce journal est inutile
Posté par Voltairine . Évalué à 4 (+5/-3).
J'ai critiqué la méthode employée.
Faire appel à une IA pour obtenir une solution, plus ou moins bancale, sans efforts, est à l'opposé de ce que tu appelles la « culture du hacker » : il n'y a pas de volonté de comprendre le fonctionnement de l'outil pour l'adapter à ses besoins.
Et si pour ce faire on a pas le bagage nécessaire, le mieux est de faire appel à ceux qui connaissent le mieux l'outil, à commencer par ses développeurs.
J'ai cliqué sur inutile parce que tu surinterprètes les propos d'autrui.
[^] # Re: Ce journal est inutile
Posté par barmic 🦦 . Évalué à -1 (+0/-3). Dernière modification le 23 avril 2026 à 01:17.
Rien de cela ne parle d'IA, mais de hacking.
J'ai cliqué sur inutile parce que tu ne te rend pas compte de ce que tu dis
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
# à la lecture
Posté par steph1978 . Évalué à 10 (+11/-0).
1/ la détection du fait d'être dans Nextcloud est un peu alambiquée. Mais bon, si tu restreint le script au domaine de ton Nextcloud, cette détection est presque inutile.
2/ le script remplace la recherche complètement si je comprends bien. Il aurait pu se contenter de surcharger la page des résultats en y ajoutant un nouvel outil.
3/ le script utilise un cache pour garder le résultat de la recherche, sans expiration. Donc si tu ajoutes un document, par l'interface web ou sur l'ordinateur, il n’apparaîtra pas dans les résultats ; cela pourrait être corrigée par le point 2.
Par ailleurs, je n'utilise pas NextCloud mais OwnCloud. Et dans owncloud, la recherche a exactement le comportement que tu recherches : dans les résultats, si tu cliques sur un fichier, cela ouvre le dossier parent et scrolle jusqu'au fichier en question.
[^] # Re: à la lecture
Posté par dark_moule . Évalué à 3 (+3/-1).
1/ J'utilise 3 serveurs différents, alors Claude a changé la détection qui était initialement sur un domaine précis.
2/ Je ne sais pas trop ce qu'il fait, en tout cas cela ajoute une icône dans la vue des résultats de la recherche "ouvrir le dossier". A l'usage j'ai l'impression que c'est resté comme avant, avec une icône qui peut mettre quelques secondes pour arriver sur tous résultats s'il y en a beaucoup. Mais le temps de lire les noms des fichiers pour trouver celui qui m'intéresse, les icônes sont déjà là.
3/ Si un tiers ajoute un fichier dans un dossier consulté, il n'apparaît pas automatiquement sur l'interface web. Il faut recliquer sur le dossier pour rafraîchir la page. En tout cas chez moi. Pour la recherche c'est pareil, si la recherche est réalisée et que le fichier n’apparaît pas, il faut supprimer la recherche et recommencer. Le nouveau fichier ajouté dans l’intervalle apparaît bien, je viens de tester
Dans Nextcloud, si je clique sur le résultat de la recherche, cela ouvre Nextcloud office pour éditer le document ou le lecteur PDF pour afficher le résultat. Impossible de connaître le chemin d'accès, que cela soit à partir de la vue "Détail" ou même "Copier/Déplacer". C'est dommage, car je trouve cette limitation vraiment problématique.
[^] # Re: à la lecture
Posté par steph1978 . Évalué à 9 (+7/-0). Dernière modification le 20 avril 2026 à 21:09.
J'avais lu vraiment en diagonale et je m'a gouru.
En fait le script surveille la page pour y détecter un résultat de recherche. Quand il l'a trouve, il ajoute une icône "ouvrir le dossier parent", comme je le proposais ;-)
J'ai été induit en erreur par la fonction
getFilePathqui fait une recherche WebDAV vers NextCloud pour obtenir le chemin complet du fichier qu'il ne peut pas l'obtenir directement dans la page de recherche car le fichier apparaît sous la forme d'un FileID et non d'un Path. Comme il l'exécute pour chaque ligne de résultat, je comprends qu'il la mette en cache.Au final, ça a l'air pas mal.
[^] # Re: à la lecture
Posté par YBoy360 (site web personnel) . Évalué à 6 (+4/-0).
Je n'utilise pas Claude, mais il faut comprendre que c'est impressionnant quand tu voies ce qu'il peut faire. Difficile d'interdire totalement son usage, pour des projets strictement interne.
Les retours, par de gros utilisateurs : C'est super pour commencer et faire de l'IHM (Javascript + HTML), moins pour designer un modèle de données qui doit être maîtrisé sur la durée, moins pour corriger des bugs ou faire de la maintenance. Il est donc plus productif sur la durée de ne pas l'utiliser.
I use Arch BTW
[^] # Re: à la lecture
Posté par gUI (Mastodon) . Évalué à 4 (+2/-1).
Attention à la façon de l'utiliser. Si tu vas sur l'interface web que tu copies/colle le message d'erreur, t'as 50% de chances d'avoir un truc potable, le reste c'est au mieux à côté, au pire une hallucination.
Mais si tu prends claude code (l'outil) que tu le fous au milieu de ton repo git (il a donc accès à tout le code, peut compiler, tester…), que tu lui dis "j'ai vu passer tel bug, corrige-le", j'ai été surpris à quel point ça marche bien.
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: à la lecture
Posté par Voltairine . Évalué à 3 (+1/-0).
L’emplacement du fichier est indiqué juste en dessous de son nom sous la forme « dans truc/machin ».
Il me semble beaucoup plus simple de récupérer cet emplacement pour créer un lien vers /apps/files/files?dir=/truc/machin.
Et cela ne doit pas demander un travail énorme de proposer un correctif à Nextcloud pour que cet emplacement devienne un lien vers le dossier plutôt qu'un simple texte.
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.