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 10/01/2018, à 15:24

marin50

Tri fichier et deplacement selon mot clé [solved]

Bonjour tout le monde je suis nouveau en script ( a vrai dire je ne code pas aussi souvent que je le voudrai en shell hmm ) et je souhaite à l'aide de l'utilitaire grep faire une recherche dans le dossier courant des fichier contenant un mot clé passer en argumant au script et les copier dans un dossier lui aussi passez en argument

je precise que je n'ai pas accés à l'ordinateur car c'est un serveur et que je ne m'y connecte qu'en ssh ^^

voici mon code

#!/bin/bash

echo "$1"
echo "$2"


liste_serie=$(ls)
liste= $($liste_serie | grep `"$1"`)
echo "$liste"

for nom in $liste
        do
                cp $nom $2
                echo $nom
        done
exit 0

j'execute ainsi le fichier:

./cp_grep.sh mot_cle dossier

Dernière modification par marin50 (Le 15/01/2018, à 20:10)

Hors ligne

#2 Le 10/01/2018, à 16:08

DonutMan75

Re : Tri fichier et deplacement selon mot clé [solved]

Hello,
je propose l'idée de script suivante (pas testée...)

#! /bin/sh
MOT_CLEF="$1"
REPERTOIRE_SORTIE="$2"

find . -type f -name "*${MOT_CLEF}*" -exec cp {} "$REPERTOIRE_SORTIE" \;

Exemple d'appel : si on veut rediriger chaque fichier contenant le mot clef "toto" dans /repertoire/final/ on tape :

$ ./mon_script "toto" "/repertoire/final/"

EDIT : la commande ci-dessus était erronée, il manquait un '\' à la fin.

Explications :

MOT_CLEF="$1"
REPERTOIRE_SORTIE="$2"

Ici on récupére classiquement les variables d'entrées dans deux variables nommées pour plus de clarté

find . : on cherche dans le répertoire courant...
-type f : ...uniquement les fichiers...
-name "*${MOT_CLEF}*" : dont le nom contient $MOT_CLEF
-exec : on exécute la commande suivante pour chaque fichier trouvé
cp {} "$REPERTOIRE_SORTIE" ; : on copie le fichier en question vers le répertoire de sortie

Le soucis de ce script (et du tiens aussi du coup) c'est que si deux fichiers ayant le même nom se trouvent dans une sous-arborescence de ton répertoire de recherche, ils seront écrasés...

Tiens nous au courant et bon courage pour la suite smile

Donut

Dernière modification par DonutMan75 (Le 12/01/2018, à 23:51)

Hors ligne

#3 Le 10/01/2018, à 17:12

Compte anonymisé

Re : Tri fichier et deplacement selon mot clé [solved]

DonutMan75 a écrit :

Hello,
je propose l'idée de script suivante (pas testée...)

#! /bin/sh
MOT_CLEF="$1"
REPERTOIRE_SORTIE="$2"

find . -type f -name "*${MOT_CLEF}*" -exec cp {} "$REPERTOIRE_SORTIE" ;

Exemple d'appel : si on veut rediriger chaque fichier contenant le mot clef "toto" dans /repertoire/final/ on tape :

$ ./mon_script "toto" "/repertoire/final/"

Explications :

MOT_CLEF="$1"
REPERTOIRE_SORTIE="$2"

Ici on récupére classiquement les variables d'entrées dans deux variables nommées pour plus de clarté

find . : on cherche dans le répertoire courant...
-type f : ...uniquement les fichiers...
-name "*${MOT_CLEF}*" : dont le nom contient $MOT_CLEF
-exec : on exécute la commande suivante pour chaque fichier trouvé
cp {} "$REPERTOIRE_SORTIE" ; : on copie le fichier en question vers le répertoire de sortie

Le soucis de ce script (et du tiens aussi du coup) c'est que si deux fichiers ayant le même nom se trouvent dans une sous-arborescence de ton répertoire de recherche, ils seront écrasés...

Tiens nous au courant et bon courage pour la suite smile

Donut

Bonjour,

Bonne idée d'utiliser find pour cet exercice,

par contre il faut protéger le point virgule à la fin, avec par exemple un anti-slash, sinon ça ne marchera pas.

Ensuite il va chercher dans tout les sous dossiers, ce qui n'est pas forcément le but cherché, -maxdepth 1 peut être utiliser pour limiter au répertoire courant.

#4 Le 10/01/2018, à 17:38

Watael

Re : Tri fichier et deplacement selon mot clé [solved]

nomCherchE="$1"
dest="$2"
for f in ./*
do
   test -f "$f" -a "$f" = "$nomCherchE" && { echo "$f"; cp "$f" "$dest";}
done
| grep `"$1"`

attention !
là, le "mot clé" $1 est exécuté, parce qu'il est entre backticks.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 11/01/2018, à 15:38

marin50

Re : Tri fichier et deplacement selon mot clé [solved]

Bonjour et merci tout le monde avec find j'ai une erreur: il manque un argument à -exec hmm

Hors ligne

#6 Le 11/01/2018, à 15:46

Compte anonymisé

Re : Tri fichier et deplacement selon mot clé [solved]

Tu as mis un anti slash avant le point virgule ?

\;

Dernière modification par Compte anonymisé (Le 11/01/2018, à 15:47)

#7 Le 11/01/2018, à 17:29

marin50

Re : Tri fichier et deplacement selon mot clé [solved]

oui il est bien mit hmm

Hors ligne

#8 Le 11/01/2018, à 18:27

Watael

Re : Tri fichier et deplacement selon mot clé [solved]

avec find j'ai une erreur: il manque un argument à -exec

il faut nous montrer la commande que tu as tapée.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 11/01/2018, à 18:33

marin50

Re : Tri fichier et deplacement selon mot clé [solved]

./cp_grep.sh Strike.Back Strike_Back

Hors ligne

#10 Le 11/01/2018, à 19:02

Watael

Re : Tri fichier et deplacement selon mot clé [solved]

la commande find ! smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 12/01/2018, à 18:57

marin50

Re : Tri fichier et deplacement selon mot clé [solved]

ah excuse moi voila le script avec la commande find ^^

#!/bin/bash

echo "$1"
echo "$2"
MOT_CLEF="$1"
REP_OUT="$2"

 find  -maxdepth 1 -type f -name "*${MOT_CLEF}*" -exec cp {} "$REP_OUT" \;

exit 0

Hors ligne

#12 Le 13/01/2018, à 00:07

DonutMan75

Re : Tri fichier et deplacement selon mot clé [solved]

Hello,
il manque un . après ton find, la commande exacte serait donc :

$ find . -maxdepth 1 -type f -name "*${MOT_CLEF}*" -exec cp {} "$REP_OUT" \;

Pour être 100% propre, il faudrait aussi penser à protéger tes arguments lors de l'appel de ton programme (par exemple dans le cas où il y aurait un espace dans un des noms...) :

$ ./cp_grep.sh "Strike.Back" "Strike_Back"

Et là ça devrait passer crème smile

Bonne soirée à tous,

Donut

Hors ligne

#13 Le 13/01/2018, à 00:41

Watael

Re : Tri fichier et deplacement selon mot clé [solved]

par défaut, find traite le répertoire courant, ce qu'indique le point.
donc, omettre la désignation d'un répertoire, ou indiquer le répertoire courant par un point, devrait avoir le même effet...

un espace insécable ne se serait-il pas immiscé sur la ligne durant l'écriture du script ?

od -c ./cp_grep.sh 

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 13/01/2018, à 15:02

marin50

Re : Tri fichier et deplacement selon mot clé [solved]

j'execute la commande :

od -c ./cp_grep.sh

et ci dessous voila ce quelle me retourne ^^ je suppose qu'elle lit tout les caractere du fichier non ? ^^

0000000   #   !   /   b   i   n   /   b   a   s   h  \n  \n   e   c   h
0000020   o       "   $   1   "  \n   e   c   h   o       "   $   2   "
0000040  \n   M   O   T   _   C   L   E   F   =   "   $   1   "  \n   R
0000060   E   P   _   O   U   T   =   "   $   2   "  \n  \n       f   i
0000100   n   d           -   m   a   x   d   e   p   t   h       1
0000120   -   t   y   p   e       f       -   n   a   m   e       "   *
0000140   $   {   M   O   T   _   C   L   E   F   }   *   "       -   e
0000160   x   e   c       c   p       {   }       "   $   R   E   P   _
0000200   O   U   T   "       \   ;  \n  \n   e   x   i   t       0  \n
0000220

Hors ligne

#15 Le 13/01/2018, à 16:01

Watael

Re : Tri fichier et deplacement selon mot clé [solved]

je suppose qu'elle lit tout les caractere du fichier non ?

si, c'est ça; y compris les caractères échappés/invisibles.

pour le coup, il n'y en a pas, et je sèche.

essaye comme ça :

find  -maxdpeth 1 -type f -name "*$motClef*" -exec cp -t "$repOut" {} +

au lieu de traiter les fichiers un par un, ça envoie la liste des fichiers trouvés à la commande à exécuter.

NB: les variables utilisateurs ne doivent jamais être tout en majuscules (c'est réservé aux variables d'environnement); mais on peut panacher. santé ! wink

Dernière modification par Watael (Le 13/01/2018, à 16:02)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#16 Le 13/01/2018, à 18:02

marin50

Re : Tri fichier et deplacement selon mot clé [solved]

d'accord mais c'est une conventions pour les variable ou cela est risquée pour le système ? ^^

alors le script semble s'exécuter mais aucun fichier n'est déplacé ^^

Hors ligne

#17 Le 13/01/2018, à 18:37

Watael

Re : Tri fichier et deplacement selon mot clé [solved]

non, le système ne craint rien, mais tu risques d'écraser des variables d'environnement utilisées pendant l'exécution de ton script.

cp ne déplace pas les fichiers, il les copie !

tu as mis à jour les noms des variables, bien sûr...


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#18 Le 13/01/2018, à 18:40

marin50

Re : Tri fichier et deplacement selon mot clé [solved]

d'accord ^^
oui c'est vrai mea culpa ^^
évidemment ^^

Hors ligne

#19 Le 15/01/2018, à 20:09

marin50

Re : Tri fichier et deplacement selon mot clé [solved]

voila la solution:

#!/bin/bash

echo "$1"
echo "$2"
motClef=$1
repOut=$2

find -maxdepth 1 -name "*${motClef}*" -not -name "repOut" -exec cp -r '{}' "./${repOut}"  \;

exit 0

Hors ligne

#20 Le 15/01/2018, à 20:27

Watael

Re : Tri fichier et deplacement selon mot clé [solved]

-not -name "$repOut"

non ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne