OVH Cloud OVH Cloud

basename et pipe

12 réponses
Avatar
françois
Bonjour,

je veux utilisé basename avec find
et grep, le problème c'est que je me retrouve
toujours avec une erreur:

$ find / | grep -i toto | basename

basename: trop peu d'argument

j'ai bien tenté avec "-" ==> basename -
toujours rien (pas d'erreur, mais là il ne match pas)

(je vous soulage de toutes les possibilitées
que j'ai pu essayé).


si quelqu'un a une idée, pas ce que làà je sèche.

Cordialement.

10 réponses

1 2
Avatar
Arnaud Launay
Le Sat, 08 Jan 2005 18:08:42 GMT, françois écrivit:
$ find / | grep -i toto | basename
basename: trop peu d'argument


Normal... Sur un basename gnu:
asl $ basename --help
Usage: basename NAME [SUFFIX]
or: basename OPTION

j'ai bien tenté avec "-" ==> basename -
toujours rien (pas d'erreur, mais là il ne match pas)


Normal, basename ne prend pas l'entree standard comme argument.

si quelqu'un a une idée, pas ce que làà je sèche.


Plusieurs:
find / | grep -i toto | xargs basename

for i in `find / | grep -i toto`; do basename $i; done

etc... Sachant que la premiere version a moins de chance de se
planter que la deuxieme.

Arnaud.
--
http://launay.org/blog/
http://www.cusae.com/

Avatar
Stephane Chazelas
2005-01-08, 18:08(+00), françois:
Bonjour,

je veux utilisé basename avec find
et grep, le problème c'est que je me retrouve
toujours avec une erreur:

$ find / | grep -i toto | basename
[...]


basename ne prend les chemins de fichiers (un seul d'ailleurs)
que parmis ses arguments, pas sur son entree standard.

Utilise awk a la place.

find / -print | awk -F/ '/toto/ {print $NF}'
(note que cette logique ne marche pas pour les noms de fichiers
qui contiennent des sauts de lignes).

Ou, si tu as le GNU find:

find / ( -name '*toto*' -o -name '.*toto*' ) -printf '%fn'
(qui n'est pas equivalent vu que ca ne cherche "toto" que dans
le nom du fichier).

(avec des versions recentes de GNU find, tu n'as plus besoin du
-o -name '.*toto*').

--
Stephane

Avatar
Stephane Chazelas
2005-01-8, 18:13(+00), Arnaud Launay:
[...]
Usage: basename NAME [SUFFIX]
or: basename OPTION
[...]

find / | grep -i toto | xargs basename


Sans compter que l'output de find n'est pas approprié a l'input
de find, ca ne marchera pas sans "-n 1" à xargs a moins qu'il
n'y ait qu'un seul fichier dont le chemin contient toto.

for i in `find / | grep -i toto`; do basename $i; done

etc... Sachant que la premiere version a moins de chance de se
planter que la deuxieme.


Ca se discute.

La premiere plante sur les SPC, TAB, NL, backslash et plante
completement s'il y a une single ou double quote.

La deuxieme plante sur les SPC, TAB, NL et possiblement sur les
wildcards.

Avec:

IFS='
'
set -f
for i in `find / | grep -i toto`; do basename -- "$i"; done

c'est deja un peu plus correct.

--
Stephane

Avatar
Arnaud Launay
Le Sat, 8 Jan 2005 18:25:07 +0000, Stephane Chazelas écrivit:
IFS='
'
set -f
for i in `find / | grep -i toto`; do basename -- "$i"; done
c'est deja un peu plus correct.


Mouairf. Je préfère encore
find / -print0 -iname '*toto*' | xargs -0 basename

Arnaud.
--
http://launay.org/blog/
http://www.cusae.com/

Avatar
Jacques L'helgoualc'h
Dans l'article ,
[...]
find / -print0 -iname '*toto*' | xargs -0 basename


La demande initiale correspondait plutôt à l'option de find

-iregex '.*toto.*'

mais ce n'était pas forcément ce qui était voulu...
--
Jacques L'helgoualc'h

Avatar
Stephane Chazelas
2005-01-8, 18:48(+00), Arnaud Launay:
[...]
Mouairf. Je préfère encore
find / -print0 -iname '*toto*' | xargs -0 basename
[...]


basename ne prend au plus que 2 arguments et le deuxieme n'est
pas un nom de fichier (ce qui fait que xargs n'a aucun interet
par rapport a -exec). -print0 est une action, elle doit etre
placee apres la condition. -iname, -print0, -0 ne marchent que
sous les systemes GNU ou BSD.

Sauf avec les versions tres recentes du GNU find, ca va ommetre
les fichiers dont le nom commence par un ".".

Tu auras une erreur de basename s'il n'y a pas de fichier
matchant (voir l'option non portable "-r" de GNU xargs).

Enfin, ce n'est pas equivalent puisque ca ne ramene pas les
fichiers dont le chemin contient toto mais pas le nom.
find / -ipath '*toto*' -exec basename '{}' ;

Plus portable:

find / -name '*[tT][oO][tT][oO]*' -exec basename '{}' ;

Plus efficace:

find / -print | grep -i toto | sed 's,.*/,,'

Avec zsh:

setopt extendedglob
print -rl /**/*~^*(#i)toto*

(ca peut etre lent).

--
Stephane

Avatar
Nicolas George
Stephane Chazelas wrote in message
:
setopt extendedglob
print -rl /**/*~^*(#i)toto*


J'ai l'impression qu'il manque un (:t) à la fin pour ne garder que la base
du nom.

Avatar
françois
Arnaud Launay wrote:
Le Sat, 08 Jan 2005 18:08:42 GMT, françois écrivit:

$ find / | grep -i toto | basename
basename: trop peu d'argument



Normal... Sur un basename gnu:
asl $ basename --help
Usage: basename NAME [SUFFIX]
or: basename OPTION


j'ai bien tenté avec "-" ==> basename -
toujours rien (pas d'erreur, mais là il ne match pas)



Normal, basename ne prend pas l'entree standard comme argument.


si quelqu'un a une idée, pas ce que làà je sèche.



Plusieurs:
find / | grep -i toto | xargs basename




J'ai déjà essayé :toujours la même erreur (?)


for i in `find / | grep -i toto`; do basename $i; done



ça à l'air de marcher, mais je ne m'attendais pas à ce comportement
je l'ai un peu modifier:

find / -type d au lieu de find /, par contre la sortie est horrible
j'ai un mot (ou groupe de mot non espacé) par ligne, et je ne suis
toujours pas certain du résultat (j'y travaille).


etc... Sachant que la premiere version a moins de chance de se
planter que la deuxieme.


en l'occurence la première version ne marche pas ,à moins d'avoir
fait les choses de travers ...



Arnaud.


Merci encore.


Avatar
françois
oh la la !,

J'ai quelques problème au niveau du serveur de news
du fai, les messages arrive un peu en retard, donc si
j'ai l'air de répondre un peu de travers désolé (pas de
ma faute).

je vais lire tous ça tranquillement.

Merci à tous :-) .
Avatar
Stephane Chazelas
2005-01-8, 19:38(+00), Nicolas George:
Stephane Chazelas wrote in message
:
setopt extendedglob
print -rl /**/*~^*(#i)toto*


J'ai l'impression qu'il manque un (:t) à la fin pour ne garder que la base
du nom.


Effectivement, ainsi qu'un (D) pour les dotfiles. Merci pour la
correction.

print -rl /**/*~^*(#i)toto*(D:t)

--
Stephane


1 2