Scénario simple: je cherche un fichier wsdl
perdu au milieu d'un projet.
$ find -name '*.wsdl'
./some/very/very/long/way/to/some/lost/directory/filename.wsdl
Maintenant que je sais où il se trouve, je veux faire quelque chose avec ce fichier, disons le modifier. Au lieu de copier/coller le chemin derrière ma commande, est-il possible d'utiliser le chemin renvoyé plus tôt par find
? Tout comme il est possible d'accéder au dernier argument que vous avez tapé avec !$
ou à votre dernière commande avec !!
.
J'ai lu que c'était possible avec $?
, mais cela ne me renvoie qu'une erreur: 0: command not found
$ echo $?
0: command not found
Exécutez la commande dans la substitution de commande:
output=$( find -name '*.wsdl' )
echo "$output"
La sortie est maintenant stockée dans la variable output
que vous pouvez utiliser autant de fois que vous le souhaitez.
Il n'y a pas de variable bash spéciale pour cela.
$?
contient le code de sortie de la dernière commande (0 = succès,> 0 = code d'erreur)
Vous pouvez utiliser la sortie de find
avec l'indicateur -exec
, comme ceci:
find -name '*.wsdl' -exec emacs {} \;
Le {}
est remplacé par le nom de fichier trouvé par find
. Cela exécuterait la commande pour chaque fichier trouvé. Si vous voulez exécuter une commande avec tous les fichiers trouvés comme arguments, utilisez un +
à la fin, comme ceci:
find -name '*.wsdl' -exec emacs {} +
Cela ouvrirait une instance emacs avec tous les fichiers .wsdl trouvés ouverts.
Une solution plus générale consiste à stocker le résultat dans une variable:
result=$(find -name '*.wsdl')
emacs $result
Cela fonctionne avec toutes les commandes, pas seulement trouver. Bien que vous puissiez également utiliser xargs
:
find -name '*.wsdl' | xargs emacs {}
Voici un petit hack qui devrait faire ce que vous voulez avec un minimum de frappe, si cela ne vous dérange pas que la dernière commande soit exécutée deux fois.
Utilisez backtick, ala:
`!!`
par exemple.
$ find. -name HardToFind.txt un peu/crazy/path/to/HardToFind.txt $ vim `!!`
* edit: Je vois la question ci-dessus liée "éventuellement dupé" contient également cette réponse. toujours pertinent directement à celui-ci, donc le laisser, mais désolé pour la dupe.