Bash : copier un nombre limité de fichier

Résolu/Fermé
Jeremize - 20 déc. 2007 à 00:44
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 20 déc. 2007 à 22:00
Bonjour,

J'ai un répertoire qui contient pas loin de 100 000 fichiers
J'aimerais couper/coller 5 000 fichiers de ce répertoire vers un autre.

Que faut t'il ajouter à la commande suivante pour arrêter le déplacement dès que 5 000 fichiers ont été déplacés ?
mv /home/monrepertoir/* /repertoire_de_destination/

Merci
Jérémie
A voir également:

11 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
20 déc. 2007 à 06:09
Salut,
for i in $(ls /home/monrepertoire | head -n5000);do mv /home/monrepertoire/$i /repertoire_de_destination/ ;done

2
Qwerti Messages postés 166 Date d'inscription dimanche 2 septembre 2007 Statut Membre Dernière intervention 28 octobre 2008 85
20 déc. 2007 à 02:13
Salut Jeremize,

Je ne pense pas qu'on puisse simplement rajouter un "truc" a la fin de ta commande pour n'avoir que les 5000 premiers fichiers.

Ce que je te propose c'est la chose suivante (en utilisant la super chouette command sed) :

Mets-toi dans le repertoire aux 100000 fichiers et tape ceci :

'ls' -1 | grep '' -m 5000 | sed -e s/^/mv\ /g -e s/$/\ repertoire_de_destination/g > mv5000firstfiles

Cette commande cree un fichier nommé mv5000firstfiles qui a la tete suivante :

mv fichier1 repertoire_de_destination/
mv fichier2 repertoire_de_destination/
etc...
mv fichier5000 repertoire_de_destination/

(en supposant que ton repertoire contient les fichiers nommés fichier1, fichier2, etc..., fichier100000).

Ensuite tu tapes :

chmod u+x mv5000firstfiles

pour pouvoir l'executer, et enfin :

./mv5000firstfiles

pour l'exectuer effectivement.

Voila c'est la seule possibilite a laquelle je pense.

(D'ailleurs cette solution est pas mal, car tu conserves une trace des deplacements des fichiers dans mv5000firstfiles.)

Tiens-moi au courant !

a+
-Qwerti.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
20 déc. 2007 à 08:16
En fait fait plutôt comme ça
$(ls /home/monrepertoire/* | head -n5000);do mv $i /repertoire_de_destination/;done
--

lami20j
0
Bonjour

Merci pour vos réponses !

>> lami20j
Lorsque je tape sur putty
$(ls /home/monrepertoire/ * | head -n5000);do mv $i /home/destination/;done

L'erreur suivante s'affiche :
-bash: syntax error near unexpected token `do'

>> Qwerti

Quand je tape ta ligne de code, c'est bon , le fichier se cré mais lorsque je change le nom du répertoire de destination par
'ls' -1 | grep '' -m 1000 | sed -e s/^/mv\ /g -e s/$/\ /mon/repertoire/de/destination/g > mv5000firstfiles

J'ai ça :
sed: -e expression n°2, caractère 7: option inconnue pour `s'

C'est sans doute un problème de slash /mon/repertoire/de/destination/g
c'est quoi ce "/g" à la fin ?
Peux tu m'aider ?
Merci
Jérémie :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Qwerti Messages postés 166 Date d'inscription dimanche 2 septembre 2007 Statut Membre Dernière intervention 28 octobre 2008 85
20 déc. 2007 à 11:28
Jeremize,

Il faut faire attention aux caracteres que tu utilises dans le nom du repertoire.

S'il faut tout deplacer dans le repertoire

/mon/repertoire/de/destination

alors il faut taper comme ca :

\/mon\/repertoire\/de\/destination

(tous les caracteres bizarres sont a faire preceder d'un antislash \ )

Le /g a la fin n'est qu'un drapeau qui dit a sed de TOUT remplacer (sinon il ne remplace que la premiere occurence de ce qu'il trouve)

la syntaxe de la commande 's' c'est ca :

s/REGEXP/REPLACEMENT/FLAG

REGEXP c'est ce qu'il faut remplacer (ici ^ c'est debut de ligne et $ c'est fin de ligne)
REPLACEMENT c'est par quoi il faut remplacer (ici mv pour le debut et le repertoire de destination pour la fin de la ligne)
FLAG c'est un drapeau qui dit a sed comment remplacer (ici g = remplacer tout)

a+
-Qwerti.

PS. Bizarre que j'ai pas pense a faire une boucle comme toi, lami20j... ta solution est super bien aussi
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
20 déc. 2007 à 11:31
Salut,

Pour la syntaxe de "lami20j", il ne faut pas oublier le début :
for i in $(ls /home/monrepertoire/ * | head -n5000);do mv $i /home/destination/;done
Pour celle de "Qwerti", remplace les slashs (/) par n'importe quel caractère ne se trouvant pas dans la chaîne de remplacement, par exemple le dièse (#) ou la virgule (,). Quant au "g" (global) c'est pour signifier à Sed de remplacer toutes les occurrences correspondantes sur la même ligne et non pas uniquement la 1ère rencontrée, mais bon dans ce cas là, c'est inutile ;-))
0
Qwerti Messages postés 166 Date d'inscription dimanche 2 septembre 2007 Statut Membre Dernière intervention 28 octobre 2008 85
20 déc. 2007 à 11:33
Jeremize,

Pour la commande de lami20j c'est ca :

for i in $(ls /home/monrepertoire/* | head -n5000);do mv $i /repertoire_de_destination/;done

(il manquait juste le for ....)

Les deux methodes sont tres bien... Mais celle de lami20j est plus beaucoup plus directe (mais il n'y a plus de trace des fichiers deplaces...)

a+
-Qwerti.
0
Qwerti Messages postés 166 Date d'inscription dimanche 2 septembre 2007 Statut Membre Dernière intervention 28 octobre 2008 85
20 déc. 2007 à 11:35
mais bon dans ce cas là, c'est inutile ;-))

Tout a fait jipicy !!!

Mais j'aime quand les commandes sont completes... je me dit que c'est toujours mieux on sait jamais comment les choses peuvent evoluer...

a+
-Qwerti.
0
Le résumé de la solution :


cd /home/repertoire_source/
'ls' -1 | grep '' -m 1000 | sed -e s/^/mv\ /g -e s/$/\ "\/home\/destination\/"/g > mv5000firstfiles
chmod u+x mv5000firstfiles
./mv5000firstfiles



1000 = nombre de fichier à déplacer.

Merci pour vos réponses !
0
for i in $(ls /home/monrepertoire/* | head -n1000);do mv $i /repertoire_de_destination/;done

Je viens de tester, ça marche très bien et finalement c'est plus simple en une seule ligne !
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
20 déc. 2007 à 22:00
Salut,

désolé pour le for ;-)

Bizarre que j'ai pas pense a faire une boucle comme toi, lami20j... ta solution est super bien aussi
Je n'ai pas pensé non plus comme toi ;-), la tienne aussi et super bien ;-)

voici encore une possibilité
ls /home/monrepertoire/* | head -n1000 | xargs -I 'f' mv f /repertoire_de_destination/
pour garder une trace il suffit de mettre l'option -v et sauvegarder le STDOUT dans un fichier avec une redirection ou en utilisant tee
0