Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/09/2010, à 00:31

ehmicky

[Résolu]Récursion avec find -print0

Salut à tous,

Alors une question qui m'a toujours turlupiné :
On est souvent amené à exécuter plusieurs commandes sur chaque fichier d'un répertoire. On peut faire un :

for fichier in * ; do
   COMMANDES...
done

ou :

while read fichier ; do
   COMMANDES...
done < <(find DIR)

Cependant, ces solutions posent problème si l'un des fichiers contient une newline ou simplement un whitespace. Donc, on est sensé faire par exemple :

find DIR -print0 | xargs -0 -i COMMANDE

Mon problème, c'est qu'avec xargs, on ne peut mettre qu'une seule COMMANDE après lui. Ainsi, si l'on veut à la fois prendre en compte l'éventuelle présence de newlines dans les noms de fichiers, mais aussi faire une tripotée de commandes à chacun des fichiers, aucune des solutions ne marche.
J'ai pensé à plusieurs solutions, comme utiliser des named pipes, ou des redirections, ou enregistrer tous les fichiers dans une array avec xargs -0, puis utiliser cette array dans une boucle, mais à chaque fois y'avait un problème.

Est-ce que quelqu'un aurait une solution ? Merci !

Dernière modification par ehmicky (Le 21/09/2010, à 01:59)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#2 Le 21/09/2010, à 01:12

sputnick

Re : [Résolu]Récursion avec find -print0

je suis pas sur de comprendre la question.
Tu n'es pas obligé d'utiliser xargs !

find . -exec bash -c '
    ls -ld "$1"
    file "$1"
    stat -c %a "$1"
    du "$1"
' -- {} \;

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

En ligne

#3 Le 21/09/2010, à 01:26

ehmicky

Re : [Résolu]Récursion avec find -print0

J'utilisais xargs pour faire :

find -print0 | xargs -0

pour résoudre le problème d'un fichier contenant une newline. Je dis xargs, mais grep -z, sort -z, shuf -z, ou tout autre commande qui prend en compte $'\0' comme délimiteur et non $'\n' marche.
Or, quelle que soit la solution, ça me permettait de faire qu'une commande, pas plusieurs.

Mais ta solution marche, c'est vrai un simple -exec bash -c ! Merci !
Malgré tout, c'est ok, mais je me demandais si y'avait pas d'autres solutions, c'est juste au niveau du style, quelque chose qui impliquerait une boucle plutôt qu'un find étalé sur plusieurs lignes ?


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#4 Le 21/09/2010, à 01:34

sputnick

Re : [Résolu]Récursion avec find -print0

Ben un simple

for i in *; do ls -ld "$i"; file "$i"; echo "$i"; echo '--'; done
sputnick@FreAkyLab:/tmp/foo$ mkdir "foo
bar
base"
sputnick@FreAkyLab:/tmp/foo$ touch 'a a'
sputnick@FreAkyLab:/tmp/foo$ touch ccc
sputnick@FreAkyLab:/tmp/foo$ for i in *; do ls -ld "$i"; file "$i"; echo "$i"; echo '--'; done
-rw-r--r-- 1 sputnick users 0 21 sept. 02:33 a a
a a: empty
a a
--
-rw-r--r-- 1 sputnick users 0 21 sept. 02:33 ccc
ccc: empty
ccc
--
drwxr-xr-x 2 sputnick users 4096 21 sept. 02:32 foo?bar?base/
foo
bar
base: directory
foo
bar
base
--
sputnick@FreAkyLab:/tmp/foo$

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

En ligne

#5 Le 21/09/2010, à 01:46

ehmicky

Re : [Résolu]Récursion avec find -print0

J'étais sûr que for i in * faisait le word splitting de * avant d'enregistrer dans la variable i chaque token, mais vu qu'on a rarement des noms de fichiers avec newline sous la main, je me rendais pas compte !...
Ca marche impèc', ça me fera un soucis de moins même si ça a l'air stupide, merci !


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#6 Le 21/09/2010, à 07:44

credenhill

Re : [Résolu]Récursion avec find -print0

pour utiliser plusieurs commandes avec xargs

 find    -print0 | xargs -0 -I{} bash -c "cmd1 {} ; cmd2 {} ; cmd3 {}"

Hors ligne