web-dev-qa-db-fra.com

localiser avec trouver

Je veux prendre tous les fichiers du répertoire courant et les donner à "Locate" pour vérifier s'ils sont ailleurs. J'ai donc commencé avec

find -maxdepth 1 -type f -name "libd*" -exec locate {} ';'

Mais cela ne fonctionne pas car find renvoie les noms sous une forme comme "./libdrm.so" et Locate ne fonctionne pas avec le premier point. J'ai donc pensé que Locate -b devrait aider:

find -maxdepth 1 -type f -name "libd*" -exec locate -b {} ';'

Malheureusement, localiser -b ./libdrm.so ne fonctionne pas, je considère cela comme un bug. J'ai donc essayé avec le nom de base:

find -maxdepth 1 -type f -name "libd*" -exec locate \`basename {}\` ';'

Cela ne fonctionne pas non plus car `nom de base {}` est résolu en premier et le résultat est "-exec Locate '{}' ';'".

Une idée comment je peux passer "localiser" nom de base {} "" à l'exec?

2
user372194

Étant donné que vous souhaitez uniquement rechercher des fichiers dans le dossier réel, vous pouvez également utiliser

locate libd*

ou quelque chose comme ce qui suit, mais n'a pas beaucoup de sens.

ls libd* | xargs locate
locate $(ls libd*)

Si vous souhaitez utiliser find, vous pouvez également utiliser * au lieu de ., mais je citerais aussi le {}.

find * -maxdepth 1 -name "libd*" -exec locate "{}" ';'

Enfin, si vous souhaitez inclure des fichiers dot, alias des fichiers cachés avec glob.

shopt -s dotglob
find * -maxdepth 1 -name "libd*" -exec locate "{}" ';'
shopt -u dotglob
2
Thomas
find -maxdepth 1 -name "libd*" | sed 's^\./^^' | locate -

Cette solution n'est certainement pas élégante, mais elle fonctionne pour moi - sed 's^\./^^' supprime simplement "./" au début de chaque ligne.

Si vous souhaitez utiliser plusieurs commandes dans -exec, procédez comme suit:

find -maxdepth 1 -name "libd*" -exec bash -c 'basename $1 | locate -' {} \;
0
dessert

Je suggérerais soit

find . -maxdepth 1 -name "libd*" -exec sh -c 'for f; do locate "${f##*/}"; done' sh {} +

ou

find . -maxdepth 1 -name "libd*" -printf '%f\0' | while read -rd '' f; do locate "$f"; done
0
steeldriver

Cela fonctionne pour moi:

find -maxdepth 1 -type f -name "libd*" | sed -r 's/^\.\///' | xargs locate

sed -r 's/^\.\///': supprime le ./ à partir de la commande find

0
George Udosen