Une recherche avec locate
trouve des chemins dans le système de fichiers.
Souvent, vous savez a priori que vous vous intéressez uniquement aux fichiers ou aux répertoires.
Une recherche «localiser» renvoie souvent de nombreux résultats. Il serait utile d'inclure un seul des types dans le résultat, car cela permet de raccourcir la sortie.
Mais il y a un argument plus intéressant pour laisser de côté les fichiers ou les répertoires: parce que la liste des chemins de résultats peut être ambiguë - pas seulement en théorie.
L'exemple ci-dessous est un cas réel, et n'est pas inhabituel:
$ locate --regex --basename "xfce4-keyboard-overlay$"
/usr/local/bin/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay
Ok, on a trouvé quelque chose! Mais ... des fichiers ou des répertoires?
$ file /usr/local/bin/xfce4-keyboard-overlay
/usr/local/bin/xfce4-keyboard-overlay: bash script
Voilà donc un fichier ...
$ file /usr/local/share/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay: directory
tandis que le second ne l'est pas.
Cette ambiguïté rend les longues listes de chemins difficiles à lire, il serait donc très agréable de filtrer les répertoires, par exemple en utilisant une option de ligne de comman pour locate
.
Existe-t-il quelque chose comme ça? Même si le filtre des répertoires est distinct de localiser?
Au moins, on pourrait utiliser un script pour parcourir tous les noms de fichiers à vérifier - ce qui peut être lent.
while
déclaration fait?printf
pour des données arbitraires .locate
et augmentez votreread
comme suggéré ici transnum.blogspot.ie/2008/11/…la source
/usr/local/share/xfce4-keyboard-overlay
et chaque sous-répertoire de celui - ci , dans votre exemple. L'ajout d'-maxdepth 0
aides.locate --regex --basename "xfce4-keyboard-overlay$" | xargs -I % sh -c "test -d % && echo %"
xargs
avecfind
était une bonne idée, je l'ai édité pour le rendre robuste. J'espère que cela ne vous dérange pas.xargs
répétera la commande pour chaque ligne si vous spécifiez-L 1
ou-i
paramètre.Vois ici
Certes, il s'agit d'un nouveau shell pour chaque fichier, mais il a l'avantage d'être agréable et compact.
EDIT: Je n'étais pas très satisfait de cette réponse, car il s'agissait d'un nouveau shell pour chaque fichier. Cela ne devrait avoir que deux processus:
Bien sûr, ce serait bien si nous pouvions éviter de donner un coup de pied à un interprète, mais il
xargs
semble être paralysé dans sa capacité à enchaîner les commandes.la source
/home/evil/$(reboot)/xfce4-keyboard-overlay
et je l'ai couru bêtement comme çaroot
).Mes deux centimes:
C'est plus ou moins la façon dont G-Man l'a fait combiné avec la substitution de processus.
la source
Et si vous combinez
locate
avecfile
etgrep
? ...la source
file
pour chaque chemin. Notez qu'il existe souvent de nombreuses lignes de résultats à localiser. Mon test actuel recherche "gnome", donnant environ 73 000 chemins à tester.$f
qui est un fichier, lefile
programme ouvrira ce fichier et le lira . C'est très cher quand tout ce que vous avez à faire eststat()
. ………… En outre, cela donnera des résultats erronés pour les fichiers qui contiennent «répertoire» dans leurs noms (comme «répertoire_téléphone»). …………… (De plus, lafor f in `…`; do …
syntaxe ne peut pas gérer les noms contenant des espaces.)