9
votes

Comment exécuter une sous-commande à l'intérieur de Find Exec

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 {} \;


0 commentaires

3 Réponses :


0
votes

Comme toujours, appelez une coquille pour l'exécuter. XXX


1 commentaires

thnx. m très naïf au sous-vase. Est-ce que j'ai un exemple?



0
votes

@ 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 trouver 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!

Pour être plus efficace, vous devriez plutôt essayer de trouver un moyen de transformer la liste des chemins de chemin que trouver pourrait produire dans le formulaire que vous souhaitez les voir, et de le faire avec un seul processus supplémentaire.

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 SED SED (relativement). Pour que vous puissiez tuyer votre la sortie pour produire la liste des noms de fichiers souhaitée: xxx


2 commentaires

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 sur xargs autre_command , 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 boucle après le sed .



16
votes

C'est ce que vous recherchez:

find . -name "*.csv" -exec sh -c 'echo $(basename "$1")' sh {}  \;


3 commentaires

Je n'ai pas le point avec 1 $ et le second sh . Pourquoi ne pas utiliser trouver. -Name "* .csv" -exec sh -c 'echo € (Basename "$ 0")' {} \; . 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 est juste un espace réservé pour conserver la convention que le programme appelé est sh (S.t. le premier).