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

Attachment: pgpuHwikEmPwM.pgp
Description: PGP signature

Répondre à