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?
É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
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 -' {} \;
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
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