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 (
find
ne produit pas de tels noms de fichiers, mais ce n'est pas dangereux et peut être nécessaire pour des constructions similaires) -name
vérifier avant-type
vérifier car ce dernier nécessite parfois unstat
- Non
dirname
requis car le%h
le spécificateur imprime déjà le nom du répertoire -quit
pour arrêter la recherche après le premier fichier trouvé, donc pas dehead
requis, 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 àfind
pour restreindre davantage les fichiers que vous obtenez. - La tuyauterie à travers
head -1
filtrera 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.dirname
peut prendre une spécification de fichier complète et vous donner le bit de chemin.cd
passe 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]> _