Lorsque j'utilise find
, il trouve souvent plusieurs résultats comme
find -name pom.xml
./projectA/pom.xml
./projectB/pom.xml
./projectC/pom.xml
Je souhaite souvent ne sélectionner qu'un résultat spécifique (par exemple edit ./projectB/pom.xml
). Existe-t-il un moyen d'énumérer la find
sortie et de sélectionner un fichier à passer dans une autre application? comme:
find <print line nums?> -name pom.xml
1 ./projectA/pom.xml
2 ./projectB/pom.xml
3 ./projectC/pom.xml
!! | <get 2nd entry> | xargs myEditor
?
[Modifier] J'ai rencontré quelques bugs particuliers avec certaines des solutions mentionnées. Je voudrais donc expliquer les étapes pour reproduire:
git clone http://git.eclipse.org/gitroot/platform/eclipse.platform.swt.git
cd eclipse.platform.swt.git
<now try looking for 'pom.xml' and 'feature.xml' files>
[Modifier] Solution 1 Jusqu'à présent, une combinaison de 'nl' (sortie énumérée), head & tail semble fonctionner si je les combine en fonctions et utilise $ (!!).
c'est à dire:
find -name pom.xml | nl #look for files, enumirate output.
#I then define a function called "nls"
nls () {
head -n $1 | tail -n 1
}
# I then type: (suppose I want to select item #2)
<my command> $(!!s 2)
# I press enter, it expands like: (suppose my command is vim)
vim $(find -name pom.xml |nls 2)
# bang, file #2 opens in vim and Bob's your uncle.
[Modifier] Solution 2 L' utilisation de "select" semble également très bien fonctionner. ex:
findexec () {
# Usage: findexec <cmd> <name/pattern>
# ex: findexec vim pom.xml
IFS=$'\n';
select file in $(find -type f -name "$2"); do
#$EDITOR "$file"
"$1" "$file"
break
done;
unset IFS
}
Your find command | head -TheNumberYouWant
accomplissement de vos besoins? (Avec votre ligne:!! | head -2 | xargs myEditor
)Réponses:
Utilisez
bash
la fonction intégréeselect
:Pour la question "bonus" ajoutée dans le commentaire:
la source
select
ne semble pas convenir à la modificationIFS
.( IFS=$'\n'; select file in $(find -maxdepth 2 -name '*.txt'); do echo "$file"; done; )
Deux petites fonctions vous aideront à résoudre ce problème à condition que vos noms de fichiers ne contiennent pas de nouvelles lignes ou d'autres caractères non imprimables. (Il gère les noms de fichiers contenant des espaces.)
Exemple
la source
pom.xml
ne contiendra jamais d'espaces (:findnum
?vous pouvez obtenir la tête des sorties totales et la queue avec -1. cela peut diriger la sortie dans n'importe quelle autre commande ou éditeur, par exemple.
(obtenez-moi 100 lignes et imprimez-moi à la dernière pipe les 100) trouver. | tête -100 | queue -1
vous obtiendrez la 100e ligne de recherche.
la source
Si votre objectif est de modifier des fichiers après une recherche, essayez sag / sack .
Exemple:
... puis pour éditer le dernier résultat de recherche ....
L'avantage est que vous pouvez revenir en arrière plus tard modifier le premier résultat de recherche avec
la source