Rechercher : dans
Par :

[Unix] déplacer fichier selon chaine contenu

Dernière réponse le 13 oct 2006 à 08:57:21 jon_chninkel, le 8 sep 2006 à 10:04:02 
 Signaler ce message aux modérateurs

Bonjour

je suis sous unix (aix).
j'aimerais écrire un script qui me permette de déplacer tous les fichiers du répertoire REP1 contenant une chaine donnée vers un autre répertoire REP2.

exemple
sh monscript.sh CHAINE REP1 REP2

je n'ai rien trouvé dans le forum ! peut-être que je m'y suis mal pris.

je pourrai me lancer avec une boucle sur chaque fichier et tester le retour d'un grep, mais je ne trouverai pas ça très propre.

si vous avez un avis sur la question et des conseils, eje suis preneur.

merci
bonne journée !
Jon

Meilleures réponses pour « [Unix] déplacer fichier selon chaine contenu » dans :
UNIX - Les fichiers Voir Introduction aux fichiers Unix Sous les systèmes UNIX tout élément est représenté sous forme de fichier. L'ensemble des fichiers est architecturé autour d'une unique arborescence dont la base, appelée racine, est notée «/». Types de...
Sed - Supprimer une ou plusieurs lignes d'un fichier VoirSupprimer une (ou plusieurs) ligne(s) d'un fichier Syntaxe sed '{[/]||[/]}d' sed '{[/][,][/]d' /.../ = délimiteurs n = le numéro de ligne chaîne = la chaîne contenue dans la...
[Windows] Obtenir la liste des fichiers d'un dossier VoirLister le contenu d'un dossier Voici une astuce simple qui permet de lister le nom des fichiers contenus dans un répertoire. Vous pourrez obtenir en un clic les titres de vos chansons, de vos photos, etc. dans un fichier...
[Commande] “grep” récursif VoirLorsque l'option -r (ou -d recurse) de la commande grep n'est pas disponible, comme sous HP-UX, il faut l'utiliser conjointement avec la commande find. Par exemple, pour chercher récursivement la chaîne «CCM» dans tous les fichiers réguliers à...
Commandes UNIX VoirTableau des principales commandes UNIX Commande Unix Description Options ls liste le contenu d'un répertoire -a Affiche tous les fichiers, y compris les fichiers cachés ...
Windows 7 - Dossiers et fichiers VoirExplorez votre PC : dossiers et fichiers Tous les fichiers nécessaires au fonctionnement de votre ordinateur, qu’il s’agisse de ceux de Windows, des logiciels installés ou des périphériques que vous utilisez, ainsi que vos fichiers personnels, sont...

1

tafiscobar, le 8 sep 2006 à 10:26:24

Salut, ben il n'y a pas d'autre moyen. Il n'y a aucun moyen de lire ce qui se trouve dans un fichier sans l'avoir ouvert. Il n'y a aussi aucun moyen de lire d'un seul coup plusieurs fichiers, a moins de travailler avec les blocs du disque dur mais la c'est une autre paire de manche (programmation bas niveau). tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!

Répondre à tafiscobar

3

jipicy, le 8 sep 2006 à 10:31:04

Arf, j'ai mis du temps à poster après la rédaction de mon post ;-(

Désolé pour le doublon ;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

2

jipicy, le 8 sep 2006 à 10:29:24

Salut,

je pourrai le lancer avec une boucle sur chaque fichier et tester le retour d'un grep, mais je ne trouverai pas ça très propre.
Euh... Ben je vois pas comment faire sans une boucle et sans "grep".
Donc à mon avis c'est LA solution.

;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

4

jon_chninkel, le 8 sep 2006 à 10:50:06

Bonjour

okay okay merci pour ces encouragements ;-)
à coup de for & de grep, je le posterai quand j'aurai réussi.


bye bye

Répondre à jon_chninkel

5

jon_chninkel, le 8 sep 2006 à 11:08:26

Bonjour

okay okay merci pour ces encouragements ;-)
à coup de for & de grep, je le posterai quand j'aurai réussi.


bye bye

Répondre à jon_chninkel

6

jon_chninkel, le 8 sep 2006 à 11:10:39

C'est bon !

#!/bin/sh
# arg1 = chaine
# arg2 = rep source
# arg3 = rep cible
REP=`ls $2`
echo "Début Recherche - Déplacement"

for FICHIER in $REP
do
if [ ! -d $2/$FICHIER ] ; then
if [ "`head -1 $2/$FICHIER | grep $1'`" ] ; then
echo "$FICHIER déplacé"
mv $2/$FICHIER $3/$FICHIER;
fi
fi
done

echo "."


Chouette. Maintenant je dois l'éprouver.

bye bye

Répondre à jon_chninkel

7

lami20j, le 8 sep 2006 à 12:32:30

Salut,

il me semble qu'on n'a pas besoin de for pour faire ça.

rgrep cherche de façon recursive
grep avec globalisation
ou combinaison find avec grep

lami20j

Répondre à lami20j

8

jipicy, le 8 sep 2006 à 14:06:05

Salut lami20j,

La récursivité agit sur les répertoires, là notre ami "jon" ne parle pas de récursivité dans les sous-répertoires (à moins que je n'ai pas bien saisi l'énoncé du problème et dans ce cas là je m'en excuse par avance), mais d'une recherche dans UN répertoire d'une chaîne contenue dans les fichiers dudit répertoire et d'un déplacement le cas échéant.

Et même si récursivité il y avait, on serait quand même obligé d'utiliser une boucle pour lire chacun des fichiers, enfin il me semble ;-))
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

9

lami20j, le 8 sep 2006 à 14:13:59

Salut,

mais d'une recherche dans UN répertoire d'une chaîne contenue dans les fichiers dudit répertoire et d'un déplacement le cas échéant.

Encore mieux.

on serait quand même obligé d'utiliser une boucle pour lire chacun des fichiers, enfin il me semble ;-))

pour l'instant je ne dit rien. je vais essayer ce soir puisque je crois que c'est possible, sinon je n'aurai pas écrit ;)

lami20j

Répondre à lami20j

10

jipicy, le 8 sep 2006 à 14:34:52

Re-

Bon, j'ai rien dit et t'as raison ;-((

Voilà les tests sans boucle, mais avec "awk" :

[jp@MDK tmpfs] $ ls -1

fich.1
fich.10
fich.2
fich.3
fich.4
fich.5
fich.6
fich.7
fich.8
fich.9
le_rep/

[jp@MDK tmpfs] $ cat fich.*

Je contiens la chaîne Bonjour
Je contiens la chaîne Aurevoir
Je contiens la chaîne Aurevoir
Je contiens la chaîne Bonjour
Je contiens la chaîne Aurevoir
Je contiens la chaîne Bonjour
Je contiens la chaîne Aurevoir
Je contiens la chaîne Bonjour
Je contiens la chaîne Aurevoir
Je contiens la chaîne Bonjour

[jp@MDK tmpfs] $ ls le_rep/

[jp@MDK tmpfs] $ grep Bonjour $(ls -1) | cp $(awk -F":" '{ print $1 }') le_rep/

[jp@MDK tmpfs] $ ls le_rep/

fich.1  fich.3  fich.5  fich.7  fich.9

[jp@MDK tmpfs] $ cat le_rep/*

Je contiens la chaîne Bonjour
Je contiens la chaîne Bonjour
Je contiens la chaîne Bonjour
Je contiens la chaîne Bonjour
Je contiens la chaîne Bonjour

[jp@MDK tmpfs] $ 
Merci lami20j ;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

11

lami20j, le 8 sep 2006 à 14:44:08

Re,

Ben, de rien.
C'est toi qui a fait le boulot ;)

lami20j

Répondre à lami20j

17

tafiscobar, le 12 sep 2006 à 13:00:22

Tu évites la boucle mais awk n'évite pas la boucle. Je ne vois toujours pas comment lire plusieurs fichiers sans boucle (implicite ou non). tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!

Répondre à tafiscobar

18

jipicy, le 12 sep 2006 à 13:20:18

Comme ça peut être : unix deplacer fichier selon chaine contenu#13

;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

19

tafiscobar, le 12 sep 2006 à 13:26:02

Ce que je voulais dire, c'est que meme si dans ton code tu évites la boucle, l'outil que tu utilises (ici egrep en particulier) lui va utiliser la boucle pour lire les fichiers que tu lui as donnés. D'ou l'utilisation du mot "implicite". tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!

Répondre à tafiscobar

20

jipicy, le 12 sep 2006 à 14:03:52

Ok ;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

12

lami20j, le 8 sep 2006 à 18:58:32

Re,

voilà ma version

lami20j@debian:~$ ls -1 salut*
salut1
salut2
salut3
salut4
salut5
salut6
salut7
salut8
salut9
lami20j@debian:~$ cat salut*
Bonjour
Au revoir
Bonjour
Au revoir
Bonjour
Au revoir
Bonjour
Au revoir
Bonjour
lami20j@debian:~$ ls -l trash/salut*
ls: trash/salut*: Aucun fichier ou répertoire de ce type
lami20j@debian:~$ egrep -l Bonjour salut* | xargs -i{} cp {} trash/
lami20j@debian:~$ ls -l trash/salut*
-rw-r--r--  1 lami20j lami20j 8 2006-09-08 18:57 trash/salut1
-rw-r--r--  1 lami20j lami20j 8 2006-09-08 18:57 trash/salut3
-rw-r--r--  1 lami20j lami20j 8 2006-09-08 18:57 trash/salut5
-rw-r--r--  1 lami20j lami20j 8 2006-09-08 18:57 trash/salut7
-rw-r--r--  1 lami20j lami20j 8 2006-09-08 18:57 trash/salut9
lami20j@debian:~$ cat trash/salut*
Bonjour
Bonjour
Bonjour
Bonjour
Bonjour
lami20j@debian:~$  
lami20j

P.S. Jipicy c'est toi qui m'a appris xargs ;)

Répondre à lami20j

13

jipicy, le 8 sep 2006 à 19:05:37

cp $(egrep -l Bonjour salut*) trash/
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

14

lami20j, le 8 sep 2006 à 19:11:35

Ben, voilà.

Les maîtres doivent se reveiller de temps en temps.
Je n'aime pas l'idée d'avoir une seule solution ;)

TMTOWTDI

There's More Than One Way To Do It

That's wonderful!!!

Merci jipicy

lami20j

Répondre à lami20j

15

jipicy, le 8 sep 2006 à 19:15:03

Bon on va clôturer là les remerciements : Merci nous et merci les z'autres !

;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

16

jon_chninkel, le 9 sep 2006 à 16:44:38

Merci donc à tous, dont moi-même ;-)
bon week-end

Répondre à jon_chninkel

21

 jon_chninkel, le 13 oct 2006 à 08:57:21

Ma solution ne marche pas bien, en fait elle semble tout me déplacer ;-(

je réessayerai les autres

Répondre à jon_chninkel