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 06/10/2010, à 12:39

domirock

[RESOLU]BASH :Passer des aruguments à une commande

Bonjour.
J'ai plusieurs dizaines de milliers de fichiers à traiter. Avec grep, j'ai fabriqué une liste de fichiers à supprimer (un bon millier)

Existe-t'il un moyen simple pour éliminer tous ces fichiers d'un coup (par exemple demander à rm de prendre cette liste en argument?)

Merci de vos lumières

Domirock

Dernière modification par domirock (Le 06/10/2010, à 13:27)

Hors ligne

#2 Le 06/10/2010, à 13:08

gigiair

Re : [RESOLU]BASH :Passer des aruguments à une commande

Tu peux faire une boucle for
for f in `cat liste-fichers-a-supprimer`;do rm $f;done


--
JJR.

Hors ligne

#3 Le 06/10/2010, à 13:09

Jidey

Re : [RESOLU]BASH :Passer des aruguments à une commande

Quelque chose comme ça peut-être :

rm `ls | grep test`

Bon là ça va supprimer tous les fichiers dont le nom contient "test" dans le dossier courant. Mais si tu mets ta commande à la place de "ls | grep test" ça devrait fonctionner. Il faut juste que ta commande retourne strictement les noms des fichiers que tu veux supprimer (éventuellement avec leur chemin), à la manière de ce que fait "ls" (et pas "ls -l" par exemple).

Dernière modification par Jidey (Le 06/10/2010, à 13:12)

Hors ligne

#4 Le 06/10/2010, à 13:15

AnsuzPeorth

Re : [RESOLU]BASH :Passer des aruguments à une commande

C'est marrant, en début d'année scolaire, il y a tjrs des gus qui doivent travailler sur plusieurs milliers de fichiers ....
Dites le que c'est pour un TP ! On ne donnera pas la réponse, mais on peut tjrs aiguiller.

Tu peux faire une boucle for
for f in `cat liste-fichers-a-supprimer`;do rm $f;done

Tu vas avoir un 'awards useless cat' toi !
Mais c'est la bonne voix pour supprimer depuis un fichier. On peut aussi regarder du coté de xargs

Dernière modification par AnsuzPeorth (Le 06/10/2010, à 13:17)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#5 Le 06/10/2010, à 13:27

domirock

Re : [RESOLU]BASH :Passer des aruguments à une commande

Merci à vous deux.

La boucle tourne nickel.... et je garde l'autre proposition pour mieux piger les pipes.

Deux réponses en 20 mn chrono, faut le faire:cool:

Hors ligne

#6 Le 06/10/2010, à 13:29

Jidey

Re : [RESOLU]BASH :Passer des aruguments à une commande

AnsuzPeorth a écrit :

On peut aussi regarder du coté de xargs

En effet, je sais plus quelle est la limite pour le nombre d'arguments, mais si y'en a vraiment beaucoup ça peut servir tongue

Hors ligne

#7 Le 06/10/2010, à 13:30

domirock

Re : [RESOLU]BASH :Passer des aruguments à une commande

C'est marrant, en début d'année scolaire, il y a tjrs des gus qui doivent travailler sur plusieurs milliers de fichiers ....
Dites le que c'est pour un TP ! On ne donnera pas la réponse, mais on peut tjrs aiguiller.

Heu non non. C'est juste une récupération par testdisk. J'ai des morceaux partout!!! tongue

Hors ligne

#8 Le 06/10/2010, à 13:43

AnsuzPeorth

Re : [RESOLU]BASH :Passer des aruguments à une commande

La boucle devrait être du genre:

while read ligne
do
rm "${ligne}"
done < fichier_url.txt

Avec xargs (je ne connais son comportement en cas de nombreuses entrées)

xargs rm < url_text.txt

EDIT: d'après le man, on peut passer un fichier en argument de xargs (je regarde pas assez souvent ce foutu man smile)

       --arg-file=file, -a file
              Read items from file instead of standard input.  If you use this
              option,  stdin  remains unchanged when commands are run.  Other‐
              wise, stdin is redirected from /dev/null.

Dernière modification par AnsuzPeorth (Le 06/10/2010, à 13:47)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#9 Le 06/10/2010, à 14:22

ehmicky

Re : [RESOLU]BASH :Passer des aruguments à une commande

Attention, xargs ne peut pas avoir plus de 128 Ko d'arguments (quelques dizaines de milliers de noms de fichiers relatifs, et moins d'une dizaine de milliers en chemin absolu), mais avec -a, je sais pas si la limite s'applique.


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

#10 Le 06/10/2010, à 14:33

survietamine

Re : [RESOLU]BASH :Passer des aruguments à une commande

ah d'accord.
Bizarre, j'avais compris que justement xargs c'était pour les cas où les commandes standard comme `ls` et `rm` n'arrivaient pas à gérer le nombre de fichiers.
Mais il est vrai que j'utilise principalement avec `find`.

find /path -type f -print0 | xargs -0 rm

(wikipedia)


Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?

Hors ligne

#11 Le 06/10/2010, à 14:57

sputnick

Re : [RESOLU]BASH :Passer des aruguments à une commande

award?v=ls&n=Jidey
http://partmaps.org/era/unix/award.html

big_smile


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

Hors ligne

#12 Le 06/10/2010, à 14:58

AnsuzPeorth

Re : [RESOLU]BASH :Passer des aruguments à une commande

L'option -delete de find, tout le monde l'oubli smile

EDIT: Y a pas un award RTFM, j'y aurais droit aussi comme ça wink

Dernière modification par AnsuzPeorth (Le 06/10/2010, à 15:01)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#13 Le 06/10/2010, à 15:08

ehmicky

Re : [RESOLU]BASH :Passer des aruguments à une commande

xargs --show-limits < /dev/null

Montre que xargs peut seulement utiliser 128 Ko de buffer. Cependant, après des tests et revoyant la man page, il me semble qu'il y a deux limites :
  1) avec l'option -I, -i, -0, -L ou -n (si le délimiteur choisi n'est pas un whitespace), si l'input de xargs contient une ligne (c'est-à-dire un ensemble de caractères sans newline) de plus de 128 Ko, il plante :

# Marche
yes | head -n65000 | tr '\n' ' ' | xargs -I{} echo {}
# Plante
yes | head -n66000 | tr '\n' ' ' | xargs -I{} echo {}

2) si aucune des options précédentes n'est choisie, et facultativement avec l'option -n ou -a, et que l'input de xargs contient un mot (c'est-à-dire un ensemble de caractères sans whitespace) de plus de 128 Ko, il plante :

# Marche
yes | head -n130000 | tr -d '\n' | xargs
# Plante
yes | head -n140000 | tr -d '\n' | xargs
# Ne plante pas
yes | head -n1000000 | tr '\n' ' ' | xargs

Par ailleurs, dans le cas 2), un newline est inséré tous les 128 Ko. Exemple :

yes | head -n66000 | tr '\n' ' ' | xargs

Après la limite de 128 Ko dépend aussi des implantations.

Edit : j'ai un peu rangé smile

Dernière modification par ehmicky (Le 06/10/2010, à 15:35)


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

#14 Le 06/10/2010, à 15:13

Jidey

Re : [RESOLU]BASH :Passer des aruguments à une commande

sputnick a écrit :

http://www.sputnick-area.net/award?v=ls&n=Jidey
http://partmaps.org/era/unix/award.html

big_smile

Gné! tongue

C'était juste pour mettre une commande à la con entre les ``...Genre un exemple, tu sais, les trucs qui servent à rien mais qui facilitent la compréhension wink
Comme j'avais pas sa commande à lui qui donne la liste des fichiers à supprimer, j'ai pris le truc le plus con que j'ai trouvé.
On est bien d'accord que "rm *test*" c'était un poil plus simple juste pour supprimer les fichiers qui contiennent "test" dans le répertoire courant ^^'

Dernière modification par Jidey (Le 06/10/2010, à 15:17)

Hors ligne

#15 Le 06/10/2010, à 15:37

sputnick

Re : [RESOLU]BASH :Passer des aruguments à une commande

Jidey a écrit :

C'était juste pour mettre une commande à la con entre les ``...

Autant utiliser $() qui n'est pas déprécié aussi wink


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

Hors ligne

#16 Le 06/10/2010, à 16:54

Jidey

Re : [RESOLU]BASH :Passer des aruguments à une commande

sputnick a écrit :
Jidey a écrit :

C'était juste pour mettre une commande à la con entre les ``...

Autant utiliser $() qui n'est pas déprécié aussi wink

Oui, mais je voulais lui montrer l'utilisation des `...`
Pi sinon, moi je trouve que même si mon exemple est un peu con, le principe est beaucoup mieux que la boucle for. Enfin c'est mon avis...

Hors ligne

#17 Le 06/10/2010, à 17:04

sputnick

Re : [RESOLU]BASH :Passer des aruguments à une commande

award?v=backticks&n=Jidey
http://partmaps.org/era/unix/award.html#backticks


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

Hors ligne

#18 Le 06/10/2010, à 18:59

ehmicky

Re : [RESOLU]BASH :Passer des aruguments à une commande

Jidey a écrit :

Oui, mais je voulais lui montrer l'utilisation des `...`

big_smile

Jidey a écrit :

Pi sinon, moi je trouve que même si mon exemple est un peu con, le principe est beaucoup mieux que la boucle for. Enfin c'est mon avis...

La boucle for a des problèmes aussi, mais de là à dire que deux commandes pipées entourées de ` ` obsolètes là où le globbing suffit, un peu de bonne foi wink

Enfin bon, faut bien prendre la chose, c'est bien de poster des commandes mal formées je trouve, c'est comme ça qu'on progresse, tout seul devant son PC sinon, on peut pas vraiment deviner smile


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

#19 Le 06/10/2010, à 18:59

Totor

Re : [RESOLU]BASH :Passer des aruguments à une commande

Jidey a écrit :

[...]
Pi sinon, moi je trouve que même si mon exemple est un peu con, le principe est beaucoup mieux que la boucle for. Enfin c'est mon avis...

désolé mais... NON !
Sans aller jusqu'à parler des ressources, voici 1 raison valable et suffisante pour oublier ta proposition :
Si tes noms de fichiers contiennent un ou plusieurs espaces rm va planté car les espaces ne seront pas protégés.

Dernière modification par Totor (Le 06/10/2010, à 19:01)


-- Lucid Lynx --

Hors ligne

#20 Le 06/10/2010, à 22:45

Jidey

Re : [RESOLU]BASH :Passer des aruguments à une commande

ehmicky a écrit :

Enfin bon, faut bien prendre la chose, c'est bien de poster des commandes mal formées je trouve, c'est comme ça qu'on progresse, tout seul devant son PC sinon, on peut pas vraiment deviner smile

Je le prends pas mal du tout wink faudrait être con pour prendre mal des remarques constructives smile
En fait tout ce que je voulais dire, c'est que ne connaissant pas sa commande (potentiellement compliquée) qui lui donnait sa liste de fichier, je pouvais pas bien lui donner un exemple avec du globbing qu'il aurait pu appliquer directement.

Totor a écrit :

Si tes noms de fichiers contiennent un ou plusieurs espaces rm va planté car les espaces ne seront pas protégés.

Ca j'y avais pas pensé par contre big_smile
Bon faut dire que j'évite comme la peste les noms de fichier avec des espaces parce que c'est contre ma religion, mais c'est pas une raison ^^

Hors ligne

#21 Le 07/10/2010, à 06:43

Totor

Re : [RESOLU]BASH :Passer des aruguments à une commande

Jidey a écrit :

Bon faut dire que j'évite comme la peste les noms de fichier avec des espaces parce que c'est contre ma religion, mais c'est pas une raison ^^

Certe, mais ce n'est pas le cas de tout le monde : notamment des utilisateurs de ta proposition

Dernière modification par Totor (Le 07/10/2010, à 06:45)


-- Lucid Lynx --

Hors ligne