GNT sans publicité, site mobile, fonctionnalitées exclusives...

Commande find

Le
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
Lire les 9 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
NBaH
Le #23039701
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/
Jean-Jacques Doti
Le #23039941
On Fri, 21 Jan 2011 08:16:15 +0100, Fabien LUCE
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/
fra-duf-no-spam
Le #23039921
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/
Jeremie COURREGES-ANGLAS
Le #23043551
--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/
Fabien LUCE
Le #23043701
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/
Publicité
Suivre les réponses
Poster une réponse
Anonyme