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
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
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
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
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
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
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 '{}' ;
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 '{}' ;
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 '{}' ;
J'ai l'impression qu'il manque un (:t) à la fin pour ne garder que la base du nom.
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.
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@citron 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 ...
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.
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 :-) .
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).
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 :-) .
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
2005-01-8, 19:38(+00), Nicolas George:
Stephane Chazelas wrote in message
<slrncu0cqo.5ii.stephane.chazelas@spam.is.invalid>:
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.