J'essayais de trouver tous les fichiers d'un certain type répartis dans des sous-répertoires et pour mes besoins, je n'avais besoin que du nom de fichier. J'ai essayé de supprimer le composant de chemin via basename
, mais ça n'a pas marché avec xargs
:
$ find . -name '*.deb' -print | xargs basename
basename: extra operand `./pool/main/a/aalib/libaa1_1.4p5-37+b1_i386.deb'
Try `basename --help' for more information.
Je reçois la même chose (exactement la même erreur) avec l'une de ces variantes:
$ find . -name '*.deb' -print0 | xargs -0 basename
$ find . -name '*.deb' -print | xargs basename {}
Ceci, en revanche, fonctionne comme prévu:
$ find . -name '*.deb' -exec basename {} \;
foo
bar
baz
Cela se produit avec les versions récentes de Cygwin et Debian 5.0.3. Mon diagnostic est que xargs passe pour une raison quelconque en passant deux lignes d’entrée à basename, mais pourquoi? Que se passe t-il ici?
la source
xargs
Est-ce que cela crée une liste d'arguments et alimente chacun avec la commande qui vient après? sinon quelle est la différence entre cela etfind . -name '*.deb' | basename
?-a
option: "prendre en charge plusieurs arguments et les traiter chacun comme un nom".xargs
convertisstdin
commander des arguments. D'une certaine manière, c'est l'opposé deecho
, qui convertit ses arguments enstdout
. La différence entrefind ... | xargs -n1 basename
oufind ... | xargs basename -a
etfind ... | basename
est que les deux premiers vont travailler avec des implémentations debasename
qui ignorestdin
.Essaye ça:
la source
find
commande, donc je ne l’utilise que pour rechercher et lister des fichiers, et j’utilise xargs pour tout le reste.nom_base n'accepte qu'un seul argument. En utilisant
-exec
fonctionne correctement car chaque{}
est remplacé par le nom de fichier en cours de traitement et la commande est exécutée une fois par fichier correspondant , au lieu d’essayer d’envoyer tous les arguments à basename en une fois.la source
xargs
peut être forcé de simplement passer un argument aussi ...find . -name '*.deb' -print | xargs -n1 basename
Cela fonctionne, mais la réponse acceptée utilise
find
d'une manière plus appropriée. J'ai trouvé cette question à la recherche dexargs basename
problèmes que j'utilise une autre commande pour obtenir une liste des emplacements de fichiers. le-n1
drapeau pourxargs
était la réponse ultime pour moi.la source