Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Commande find

9 réponses
Avatar
Fabien LUCE
Bonjour à tous!


2 petites questions à propos de la commande find.

1) pourquoi find / -name "*test*" -mtime +7 -print0 ne se comporte pas comme find / -print0 -name "*test*" -mtime +7 ? En d'autres termes: le paramètre d'action print0 doit il toujours etre à la fin de la commande? Si oui, pourquoi?
2) comment puis-je écrire: liste_fichier=$(find / -name "*test*" -mtime +7) sans être embêté par les noms de fichiers comprenant des espaces? le print0 est pas mal mais sans xargs derrière j'ai l'impression que c'est inutile...

Merci, à bientôt!


--
Fabien LUCE
Jabber ID: ftg@lutix.org
Identi.ca: http://identi.ca/ftg
Web: www.lutix.org

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers debian-user-french-REQUEST@lists.debian.org
En cas de soucis, contactez EN ANGLAIS listmaster@lists.debian.org
Archive: http://lists.debian.org/20110121071614.GL7956@serveur.lutix.org

9 réponses

Avatar
NBaH
On ven 21 jan.2011 à 08:16:15, Fabien LUCE wrote:

2) comment puis-je écrire: liste_fichier=$(find / -name "*test*" -mtime +7) sans être embêté par les noms de fichiers comprenant des espaces? le print0 est pas mal mais sans xargs derrière j'ai l'impression que c'est inutile...



utilise un tableau/liste :
array=( $(find / -name "*test*" -mtime +7) )

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Avatar
Jean-Jacques Doti
On Fri, 21 Jan 2011 08:16:15 +0100, Fabien LUCE wrote:
Bonjour à tous!


Salut à toi !


2 petites questions à propos de la commande find.

1) pourquoi find / -name "*test*" -mtime +7 -print0 ne se comporte pas
comme find / -print0 -name "*test*" -mtime +7 ? En d'autres termes: le
paramètre d'action print0 doit il toujours etre à la fin de la commande?


Si
oui, pourquoi?


Le paramètre -print0 (ou -print, ou -ls) est considéré par find comme un
paramètre normal de son expression conditionnelle, si ce n'est qu'il est
toujours évalué à "vrai" -> tout est traité dans l'ordre où cela est écrit.
Donc si -print0 apparaît avant -mtime, les noms des fichiers sont affichés
avant que le filtre ne s'applique.

2) comment puis-je écrire: liste_fichier=$(find / -name "*test*" -mtime
+7) sans être embêté par les noms de fichiers comprenant des espaces? le
print0 est pas mal mais sans xargs derrière j'ai l'impression que c'est
inutile...


Ben avec un simple -print tu auras un nom de fichier par ligne, avec tous
tes espaces. Après tout dépend de la façon dont tu vas traiter le contenu
de la variable liste_fichier.
Sinon tu peux aussi prendre -print0, replacer le séparateur (caractère
NULL) par ce que tu veux et jouer avec IFS :
liste_fichier=$(find / -name "*test*" -mtime +7 | tr '00' '|')
IFS='|' ; for f in $liste_fichier ; do echo $f ; done

Merci, à bientôt!


De rien et A+
Jean-Jacques


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Avatar
fra-duf-no-spam
Le 14995ième jour après Epoch,
Fabien LUCE écrivait:

Bonjour à tous!


2 petites questions à propos de la commande find.

1) pourquoi find / -name "*test*" -mtime +7 -print0 ne se comporte pas
comme find / -print0 -name "*test*" -mtime +7 ? En d'autres termes: le
paramètre d'action print0 doit il toujours etre à la fin de la
commande? Si oui, pourquoi?



Ce n'est pas spécialement un "paramètre d'action", c'est juste qu e find
prends les éléments les uns après les autres, et les év alue... En
l'occurence, print0 va renvoyer "true" tout le temps, donc tes fichiers
vont être tous listés.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Avatar
Jeremie COURREGES-ANGLAS
--Pk6IbRAofICFmK5e
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Friday 21 January 2011 à 08:16:15AM, Fabien LUCE wrote:
Bonjour à tous!


2 petites questions à propos de la commande find.

1) pourquoi find / -name "*test*" -mtime +7 -print0 ne se comporte pas co mme find / -print0 -name "*test*" -mtime +7 ? En d'autres termes: le param ètre d'action print0 doit il toujours etre à la fin de la command e? Si oui, pourquoi?
2) comment puis-je écrire: liste_fichier=$(find / -name "*test*" - mtime +7) sans être embêté par les noms de fichiers comprena nt des espaces? le print0 est pas mal mais sans xargs derrière j'ai l' impression que c'est inutile...

Merci, à bientôt!



Comme celà a été dit, il vaut mieux mettre -print0 à la fin des arguments
passés à find. A part ça :
* tu as parfaitement raison, on ne devrait jamais utiliser xargs sans -0
* find a un xargs "builtin". Je m'explique :

$ find /foo -type f -bla -bla -exec ma commande {} ;

va exécuter "ma commande" pour chaque fichier trouvé. A noter qu' il n'y a pas
de souci à se faire avec les noms de fichiers exotiques.

$ find /foo -type f -bla -bla -exec ma commande {} +

va lancer "ma commande" en lui passant un maximum de chemins en paramè tre
(comme xargs), toujours de manière sûre (quoiqu'on puisse prà ©férer -execdir).
En bonus, cette possibilité (le -exec ... +) est censé être standard.

S'il te plaît, ne cherches pas à mettre la sortie de find dans un tableau,
si à jouer avec l'IFS et faire des trucs genre :
$ for fichier in $liste_fichiers; do echo $fichier; done

Par contre, si tu n'as pas besoin d'un traitement récursif, ton shell suffit,
pas besoin de find, juste de bash :

for fichier in ./*.[jJ][pP][gG]; do
[[ -f "$fichier" ]] || continue
if [[ "$fichier" = *.jpg ]]; then
echo "OK, fichier .jpg : $fichier"
else
echo mv "$fichier" "${fichier%.???}.jpg"
fi
done

My two cents
--
"Free software, free society."
Jérémie Courrèges-Anglas
GPG key : 06A11494

--Pk6IbRAofICFmK5e
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (OpenBSD)

iQIcBAEBCAAGBQJNOtejAAoJEGGRj78GoRSUN+sQAIT67s/NhCmVSsr8/QUbUESJ
nZSmaPAZ8JtTVfEhLFShKl/bYWOqJcoc347ucqZ3LzndaYLa9/iUT9ze1RwK6L/3
FTBPGI9S1bRkHKBTdJ6UZ620DQA79CnI6+E03LMvTSoCoXJ4tYq35EdSv6kMdiKD
0T+yLbgM4M5wm+Hjmxu7EEZ8LgCpCgYJDgZBTivRAKzbTlUlp3z7ndujMKmOSF8F
18dUkR42IltiU5bkm0fuf5IofUVrUz0KE3Yr1u9n8fpkFOUd0sGJLYCqRpisueBe
OpgSMnkIotIvlDy2h+PYwO4YoPGPRMQ0IMmFevC8lhRKuHicZutpmB5yWJ5XpyxK
U8lvcHKQ7aY2vmtJQoWmRldXP11SORNd9aONaqQZuQJpaoib94QxRukJypjA4hB2
o8VlEPF7FFkO5VaOy4W73bsgwyZy92MTs1XYCk73USSuiJSQz4vdQp3bRXCzMqH7
ZKglXCMG5EswYkSSifoHRHSVfcuiqf69kdQ1kRwowEWMA0nroOddJsVqqNnoxB7P
vHM+t5utIzKahOyi9XOOC95ZxVkrP2n+20HMpIWsnIY/KsFFPYLyJJeVOFMzGVlr
A1oDNdY2a2lsHkiKZ/kU+0ho5wa1J94riNjsbe13AQ6DaFsRhhYIIikyUDSxgj8m
lLmkl7mL/1YP9m2UGSDe
=BPWR
-----END PGP SIGNATURE-----

--Pk6IbRAofICFmK5e--

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Avatar
Fabien LUCE
On Sat, Jan 22, 2011 at 02:12:04PM +0100, Jeremie COURREGES-ANGLAS wrote:
On Friday 21 January 2011 à 08:16:15AM, Fabien LUCE wrote:
> Bonjour à tous!
>
>
> 2 petites questions à propos de la commande find.
>
> 1) pourquoi find / -name "*test*" -mtime +7 -print0 ne se comporte pas comme find / -print0 -name "*test*" -mtime +7 ? En d'autres termes: le paramètre d'action print0 doit il toujours etre à la fin de la commande? Si oui, pourquoi?
> 2) comment puis-je écrire: liste_fichier=$(find / -name "*test*" -mtime +7) sans être embêté par les noms de fichiers comprenant des espaces? le print0 est pas mal mais sans xargs derrière j'ai l'impression que c'est inutile...
>
> Merci, à bientôt!

Comme celà a été dit, il vaut mieux mettre -print0 à la fin des arguments
passés à find. A part ça :
* tu as parfaitement raison, on ne devrait jamais utiliser xargs sans -0


j'ai du le dire entre les lignes sans faire exprès car ce n'est pas ce que je pensais exprimer ;)



* find a un xargs "builtin". Je m'explique :

$ find /foo -type f -bla -bla -exec ma commande {} ;

va exécuter "ma commande" pour chaque fichier trouvé. A noter qu'il n'y a pas
de souci à se faire avec les noms de fichiers exotiques.

$ find /foo -type f -bla -bla -exec ma commande {} +



cela va executer la commande pour l'ensemble des fichiers si je comprend bien?


va lancer "ma commande" en lui passant un maximum de chemins en paramètre
(comme xargs), toujours de manière sûre (quoiqu'on puisse préférer -execdir).
En bonus, cette possibilité (le -exec ... +) est censé être standard.

S'il te plaît, ne cherches pas à mettre la sortie de find dans un tableau,
si à jouer avec l'IFS et faire des trucs genre :
$ for fichier in $liste_fichiers; do echo $fichier; done

Par contre, si tu n'as pas besoin d'un traitement récursif, ton shell suffit,
pas besoin de find, juste de bash :

for fichier in ./*.[jJ][pP][gG]; do
[[ -f "$fichier" ]] || continue
if [[ "$fichier" = *.jpg ]]; then
echo "OK, fichier .jpg : $fichier"
else
echo mv "$fichier" "${fichier%.???}.jpg"
fi
done

My two cents
--
"Free software, free society."
Jérémie Courrèges-Anglas
GPG key : 06A11494





--
Fabien LUCE
Jabber ID:
Identi.ca: http://identi.ca/ftg
Web: www.lutix.org

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Avatar
Fabien LUCE
Hola,

je viens d'essayer un petit:
tar cjvf test.tar.bz2 $(find . -mindepth 1 -name "*" -exec echo {} +)
avec des noms de fichiers contenant des espaces... et bien gros plantage!
"
tar: ./fichier : la fonction stat a échoué: Aucun fichier ou répertoire de ce type
tar: test_3 : la fonction stat a échoué: Aucun fichier ou répertoire de ce type
"
le fichier a pour nom "fichier test3"

Voila, je ne sais pas trop pourquoi ca ne fonctionne pas!

a+




On Sat, Jan 22, 2011 at 02:12:04PM +0100, Jeremie COURREGES-ANGLAS wrote:
On Friday 21 January 2011 à 08:16:15AM, Fabien LUCE wrote:
> Bonjour à tous!
>
>
> 2 petites questions à propos de la commande find.
>
> 1) pourquoi find / -name "*test*" -mtime +7 -print0 ne se comporte pas comme find / -print0 -name "*test*" -mtime +7 ? En d'autres termes: le paramètre d'action print0 doit il toujours etre à la fin de la commande? Si oui, pourquoi?
> 2) comment puis-je écrire: liste_fichier=$(find / -name "*test*" -mtime +7) sans être embêté par les noms de fichiers comprenant des espaces? le print0 est pas mal mais sans xargs derrière j'ai l'impression que c'est inutile...
>
> Merci, à bientôt!

Comme celà a été dit, il vaut mieux mettre -print0 à la fin des arguments
passés à find. A part ça :
* tu as parfaitement raison, on ne devrait jamais utiliser xargs sans -0
* find a un xargs "builtin". Je m'explique :

$ find /foo -type f -bla -bla -exec ma commande {} ;

va exécuter "ma commande" pour chaque fichier trouvé. A noter qu'il n'y a pas
de souci à se faire avec les noms de fichiers exotiques.

$ find /foo -type f -bla -bla -exec ma commande {} +

va lancer "ma commande" en lui passant un maximum de chemins en paramètre
(comme xargs), toujours de manière sûre (quoiqu'on puisse préférer -execdir).
En bonus, cette possibilité (le -exec ... +) est censé être standard.

S'il te plaît, ne cherches pas à mettre la sortie de find dans un tableau,
si à jouer avec l'IFS et faire des trucs genre :
$ for fichier in $liste_fichiers; do echo $fichier; done

Par contre, si tu n'as pas besoin d'un traitement récursif, ton shell suffit,
pas besoin de find, juste de bash :

for fichier in ./*.[jJ][pP][gG]; do
[[ -f "$fichier" ]] || continue
if [[ "$fichier" = *.jpg ]]; then
echo "OK, fichier .jpg : $fichier"
else
echo mv "$fichier" "${fichier%.???}.jpg"
fi
done

My two cents
--
"Free software, free society."
Jérémie Courrèges-Anglas
GPG key : 06A11494





--
Fabien LUCE
Jabber ID:
Identi.ca: http://identi.ca/ftg
Web: www.lutix.org

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Avatar
Yves Rutschle
On Sat, Jan 22, 2011 at 10:06:27PM +0100, Fabien LUCE wrote:
je viens d'essayer un petit:
tar cjvf test.tar.bz2 $(find . -mindepth 1 -name "*" -exec echo {} +)



J'ai peut-être raté un épisode, mais pourquoi ne pas faire
un simple:

tar cjvf test.tar.bz2 *

?

Sinon, j'aurais tendance à ajouter des guillements autour
des noms de fichiers qui contiennent des espaces, donc:

tar cjvf test.tar.bz2 $(find . -mindepth 1 -name "*" -exec echo "{}" +)

Pas testé, donc sans garantie.

Y.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Avatar
Jeremie COURREGES-ANGLAS
--ey/N+yb7u/X9mFhi
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Saturday 22 January 2011 à 10:36:57PM, Yves Rutschle wrote:
On Sat, Jan 22, 2011 at 10:06:27PM +0100, Fabien LUCE wrote:
> je viens d'essayer un petit:
> tar cjvf test.tar.bz2 $(find . -mindepth 1 -name "*" -exec echo {} +)



Eeek.
Y'a un gros souci là.
Dans ton utilisation de find, tu ne résouds en rien le problème d es noms de
fichiers problématiques, pour une bonne raison : tu laisses le shell
"splitter" la sortie de find, par la simple utilisation de $(...).
Tu pourrais, en étant vraiment vicieux, utiliser find pour ta tâc he :

$ find . -mindepth 1 -exec tar cjvf test.tar.bz2 {} +

Mais ce genre d'utilisation est déconseillée, car on crée ai nsi des archives
qui s'extraient dans le répertoire courant.

J'ai peut-être raté un épisode, mais pourquoi ne pas faire
un simple:

tar cjvf test.tar.bz2 *

?



Histoire de sauvegarder aussi les fichiers et répertoires cachés ?
Ou pas...

Sinon, j'aurais tendance à ajouter des guillements autour
des noms de fichiers qui contiennent des espaces, donc:

tar cjvf test.tar.bz2 $(find . -mindepth 1 -name "*" -exec echo "{}" +)



Inutile, le problème intervient lorsque le shell interprète la so rtie de la
substitution $(...).
De manière générale, utiliser $(...) sans guillemets doubles autour est une
erreur.

Pas besoin de mettre des guillemets autour de {} : le shell n'interprè te
pas les noms de fichier car {} est une sémantique interne à find( 1).
find(1) passe directement par un appel à execvp(2) pour lancer la comm ande,
donc les noms de fichiers représentés par {} ne sont pas interpr étés.

Pas testé, donc sans garantie.

Y.




--
"Free software, free society."
Jérémie Courrèges-Anglas
GPG key : 06A11494

--ey/N+yb7u/X9mFhi
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (OpenBSD)

iQIcBAEBCAAGBQJNO3qnAAoJEGGRj78GoRSUPxYQANYZbjb1nOsNudag9n3Po3Sp
mO/cggAIQ7Y5qHH0CCx/a3PDaYeRXq8SO8CXbpLxsOtvHbM/KTj1Bo2heqGdSxDc
b+9FoCD2yLoSemFgR/yil5LkPBIBMttbCWYY3mxijH0ED3JYK1F8vTAe3sRnxAP8
eyCoJPLCNZy4cAwZtHET4DqayWt9xB+g3n9gVLl0t5a2YADTjSvmKgJAG47vE8rn
6ST9ZdyIdHABF82SfaldNHPNh7UjPGSVL8SkSWtNwBWX//49vAnZt63J+C7luMkN
mogqNBDfrbzCZOjNSSFaIL9xA73oUjFd+s1Z59o3rUQgEhJ0Rb1XshEoDoxNtdOJ
BTDkMH8emO7CgPL+BpICHrq812TEF2Mx0oi/yFetQ2Lwcaq4mKz0ALI33ZaGg2KM
i8WpGp+UzJ4VpSAZ8rZVmTzvm1oLxOgbL6vJMEhBY4c5fRXGeO/DYQVa9jWtDmwu
0WHlxpemqzsUvyEfAR+E/jjLlo8yJaXez87Spmov1+T64kblewjtPFV8Nqn/O2B9
GMARcbydkXhYZcYRqGECSUNPS8s+jW9QAfd9kP5m4bBTEJoFrXCISrPJsMLyjzCx
M7KYmYqtxvicVg25SIe/gWpKPeUwhVV4uGT+i6S2ZVzgeGZ7/6frM6W+7qqP2NEy
4qiesJIhNdCGMXUpZDk2
=P+/b
-----END PGP SIGNATURE-----

--ey/N+yb7u/X9mFhi--

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Avatar
Fabien LUCE
Arrrghhhhh
finalement y a pas grand chose qui pourrais me satisfaire finalement...

On Sun, Jan 23, 2011 at 01:47:36AM +0100, Jeremie COURREGES-ANGLAS wrote:
On Saturday 22 January 2011 à 10:36:57PM, Yves Rutschle wrote:
> On Sat, Jan 22, 2011 at 10:06:27PM +0100, Fabien LUCE wrote:
> > je viens d'essayer un petit:
> > tar cjvf test.tar.bz2 $(find . -mindepth 1 -name "*" -exec echo {} +)

Eeek.
Y'a un gros souci là.
Dans ton utilisation de find, tu ne résouds en rien le problème des noms de
fichiers problématiques, pour une bonne raison : tu laisses le shell
"splitter" la sortie de find, par la simple utilisation de $(...).
Tu pourrais, en étant vraiment vicieux, utiliser find pour ta tâche :

$ find . -mindepth 1 -exec tar cjvf test.tar.bz2 {} +

Mais ce genre d'utilisation est déconseillée, car on crée ainsi des archives
qui s'extraient dans le répertoire courant.

> J'ai peut-être raté un épisode, mais pourquoi ne pas faire
> un simple:
>
> tar cjvf test.tar.bz2 *
>
> ?

Histoire de sauvegarder aussi les fichiers et répertoires cachés ?
Ou pas...

> Sinon, j'aurais tendance à ajouter des guillements autour
> des noms de fichiers qui contiennent des espaces, donc:
>
> tar cjvf test.tar.bz2 $(find . -mindepth 1 -name "*" -exec echo "{}" +)

Inutile, le problème intervient lorsque le shell interprète la sortie de la
substitution $(...).
De manière générale, utiliser $(...) sans guillemets doubles autour est une
erreur.

Pas besoin de mettre des guillemets autour de {} : le shell n'interprète
pas les noms de fichier car {} est une sémantique interne à find(1).
find(1) passe directement par un appel à execvp(2) pour lancer la commande,
donc les noms de fichiers représentés par {} ne sont pas interprétés.

> Pas testé, donc sans garantie.
>
> Y.


--
"Free software, free society."
Jérémie Courrèges-Anglas
GPG key : 06A11494





--
Fabien LUCE
Jabber ID:
Identi.ca: http://identi.ca/ftg
Web: www.lutix.org

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/