Les éléments suivants devraient être plus sûrs :
cd -- "$(find / -name ls -type f -printf '%h' -quit)"
Avantages :
- Le double tiret empêche l'interprétation d'un nom de répertoire commençant par un trait d'union en option (
findne produit pas de tels noms de fichiers, mais ce n'est pas dangereux et peut être nécessaire pour des constructions similaires) -namevérifier avant-typevérifier car ce dernier nécessite parfois unstat- Non
dirnamerequis car le%hle spécificateur imprime déjà le nom du répertoire -quitpour arrêter la recherche après le premier fichier trouvé, donc pas deheadrequis, ce qui entraînerait l'échec du script sur les noms de répertoire contenant des retours à la ligne
Vous pouvez utiliser quelque chose comme :
pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"
pax[/usr/bin]> _
Cela localisera le premier ls fichier normal, puis accédez à ce répertoire.
En termes de ce que fait chaque bit :
- La recherche commencera à
/et recherchez vers le bas, en listant tous les fichiers normaux (-type f) appeléls(-name ls). Il y a d'autres choses que vous pouvez ajouter àfindpour restreindre davantage les fichiers que vous obtenez. - La tuyauterie à travers
head -1filtrera tous sauf le premier. $()est un moyen de prendre la sortie d'une commande et de la mettre sur la ligne de commande pour une autre commande.dirnamepeut prendre une spécification de fichier complète et vous donner le bit de chemin.cdpasse simplement à ce répertoire.
Si vous exécutez chaque bit dans l'ordre, vous pouvez voir ce qui se passe :
pax[/home/pax]> find / -type f -name ls
/usr/bin/ls
pax[/home/pax]> find / -type f -name ls | head -1
/usr/bin/ls
pax[/home/pax]> dirname "$(find / -type f -name ls | head -1)"
/usr/bin
pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"
pax[/usr/bin]> _