Comment puis-je exécuter un sous-mandat à l'intérieur de la recherche d'EXED? Par exemple, si je veux obtenir le nom de fichier uniquement à partir du chemin complet et imprimez-le, je tiens,
find ./ -name "*.csv" -exec echo {} \;
3 Réponses :
Comme toujours, appelez une coquille pour l'exécuter.
thnx. m très naïf au sous-vase. Est-ce que j'ai un exemple?
@ Ignacio est strictement correct, albiet a biaisé vers une coquille spécifique au lieu de suggérer une coquille Standard POSIX ... Cependant, ce que vous essayez de faire est beaucoup plus efficacement avec un filtre. C'est à dire. Vous essayez de trouver un moyen d'avoir Pour être plus efficace, vous devriez plutôt essayer de trouver un moyen de transformer la liste des chemins de chemin que Par exemple, si tout ce que vous voulez voir est le nom de base (c.-à-d. Le composant nom de fichier final) de chaque chemin nom, vous pouvez le faire trivialement avec une commande trouver code> transformer chaque chemin, il serait sur le point d'imprimer, mais que la recherche de la recherche d'un processus de shell pour chaque nom de fichier correspondant! P>
trouver code> pourrait produire dans le formulaire que vous souhaitez les voir, et de le faire avec un seul processus supplémentaire. p>
SED code> SED (relativement). Pour que vous puissiez tuyer votre code> la sortie code> pour produire la liste des noms de fichiers souhaitée: p>
Eh bien Greg, thnx pour la réponse. Je souhaite utiliser le nom de base comme premier argument d'une autre commande qui devrait courir à l'intérieur du corps de recherche -exec. toute autre façon que vous suggérez ??
Eh bien, cela dépend de la commande de la commande et de la manière dont il fonctionnera uniquement sur le nom de fichier de base (surtout sans savoir où se trouve le fichier réel du fichier). Si la commande peut accepter plusieurs noms de fichiers comme paramètres tout à la fois, vous pouvez tuyer la sortie de sed code> sur
xargs autre_command code>, par exemple. Si vous avez vraiment besoin d'appeler la commande séparément pour chaque nom (pourquoi?) Ensuite, la méthode de Ignacio peut être meilleure, bien que vous puissiez enregistrer une invocation de shell par nom en démarrant la commande à partir de la coquille mère avec un
en lecture fname; faire code> boucle après le
sed code>.
C'est ce que vous recherchez:
find . -name "*.csv" -exec sh -c 'echo $(basename "$1")' sh {} \;
Je n'ai pas le point avec 1 $ code> et le second
sh code>. Pourquoi ne pas utiliser
trouver. -Name "* .csv" -exec sh -c 'echo € (Basename "$ 0")' {} \; code>. Cela fonctionne parfaitement pour moi.
@ Tik0 le point est la cohérence. L'utilisation de $ 0 fonctionnerait effectivement ici, mais cela fait casse la convention de 0 $ SIGNIFIER Signification du nom du nom du processus d'exécution. Top ou PS serait, par exemple, signaler les noms de commande impairs. Des structures plus complexes comme une boucle pour une boucle échoueraient.
Ah Ok, le deuxième sh code> est juste un espace réservé pour conserver la convention que le programme appelé est
sh code> (S.t. le premier).