#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