Bonjour,

Mon probleme est certainement d'avantage lie a Linux en lui-meme, d'avantage que specifque a Fedora Core 6, mais je ne vois vraiment pas ou l'exposer ailleurs.

Voici donc son enonce:
Je dois copier de grandes quantites de donnees depuis une partition linux, jusqu'a un DD externe en FAT32. Grandes quantites signifie plusieurs milliers de fichiers, et plusieurs Go de donnees. Je tente de le faire via la commande cp, mais elle ne s'execute pas, car ces fichiers sont soit trop nombreux, soit la quantite est trop lourde. Ce qui m'oblige a executer la commande plusieurs fois, ce qui n'est pas bien pratique.
Les questions sont donc les suivantes: quelles sont les limites en nombre de fichier, et volume a copier de cp ? Ou alors, ou puis-je trouver l'information ?
Et existe-t-il d'autres commandes, ou d'autres logiciels qui pourraient etre adaptes a ce genre de cas extreme ?

Je pose cette question avant de creer eventuellement mon propre script perl ou bash pour resoudre ce probleme.

Enfin, je ne sais pas si cela a de l'importance dans le cas present, mais mon PC a une architecture 32bit.

Merci d'avance pour vos reponses
Bonjour/Bonsoir,
Je tente de le faire via la commande cp, mais elle ne s'execute pas, car ces fichiers sont soit trop nombreux, soit la quantite est trop lourde.
Ce n'est pas une question de taille, mais de nombre et de longueur de nom de fichiers.

Si je me rappelle bien, ce n'est pas une limitation de bash (en dépit des apparences), mais directement du noyau (tu peux voir la page de man de sysconf, en particulier ce qui est dit de la variable système ARG_MAX, c'est à peu près tout ce dont je me rappelle :lol:).

Quoiqu'il en soit, il faut que tu fasses en sorte que ta commande de copie prenne un peu moins d'arguments d'un coup. Tu peux faire un truc à base de commande « find » avec l'option « -exec » (par exemple basé sur : « find répertoire/ -exec cp {} ailleurs/ ») ; dans ce cas tes fichiers seront traités un par un. Tu peux, toujours avec find, piper la sortie avec xargs et l'option « -n » suivie d'une valeur raisonnable ; c'est un bon compromis.
Il y a peut-être des solutions plus adaptées pour ta situation, mais je ne les connais pas...

P.S. : attention à la copie sur FAT, pas de gestion des droits !
Merci pour les indications. Malheureusement, aucune des deux commandes ne semblent fonctionner, ma liste d'arguments est desesperement trop longue.

Le nombre maximum d'argument pouvant etre pris par une commande semble etre 4096 par defaut. Ce qui est effectivement trop petit, etant donne que je trouve avec plus de 5000 fichiers dans mes repertoires. Cependant, il s'agit du PC du bureau, et je ne vais donc pas trop m'aventurer a reconfigurer mon noyau.
Je vais donc me rabattre sur un script, faire quelque chose comme lister tous les fichiers du repertoire, et demander la copie un par un. C'est un peu artisanal comme methode, mais ca devrait fonctionner sans trop de probleme. Je posterai mon script des qu'il sera fini pour ceux qui pourraient avoir le meme probleme.

Pour ce qui est du FAT, effectivement, il n'y a plus de gestion de droits. Mais les donnees ne sont pas confidentielles, il n'y a donc pas de probleme. Et puis ce choix resulte d'une volonte de portabilite. Je suis un peu un OVNI au bureau avec ma machine sous linux, il faut donc que je m'adapte.
Ce que je trouve plus etonnant c'est qu'une partition FAT considere tous les fichiers comme executables. Est-ce un bug d'interpretation du justement a l'absence de droits, ou alors une necessite pour pouvoir executer les "vrais" programmes ?
et avec tar ?
tar cf - --directory /chemin/source . | tar xf - --directory /chemin/destination
A+
tu pourrais peut-être faire des tar de tes énormes dossiers avant de les copier sur l'autre disque ?
Je fais cela pour faire des back-up de certains de mes dossiers sur serveur qui contiennent bien plus que 5000 fichiers :-D

arf... doublé à 20 secondes près :-D
Je dois copier de grandes quantites de donnees depuis une partition linux, jusqu'a un DD externe en FAT32. Grandes quantites signifie plusieurs milliers de fichiers, et plusieurs Go de donnees. Je tente de le faire via la commande cp, mais elle ne s'execute pas, car ces fichiers sont soit trop nombreux, soit la quantite est trop lourde. Ce qui m'oblige a executer la commande plusieurs fois, ce qui n'est pas bien pratique.
Les questions sont donc les suivantes: quelles sont les limites en nombre de fichier, et volume a copier de cp ? Ou alors, ou puis-je trouver l'information ?
Et existe-t-il d'autres commandes, ou d'autres logiciels qui pourraient etre adaptes a ce genre de cas extreme ?
Les limitations que tu decris sont :
1. Le nombre d'arguments possibles sur la ligne de commande, et
2. La taille maximum d'un fichier autorise sur le systeme de fichier de destination (ta vfat, en l'occurrence).

Pour palier au 1., je te suggere de simplement copier recursivement le repertoire qui les contient. Si vraiment tu as besoin de filtrer la liste de fichiers a copier, pense a faire du rsync, ou du tar, avec des listes d'exclusion/inclusion. Vois les man pages pour les details.

Tu ne pourras pas palier au 2. Si un systeme de fichiers dit qu'il peut pas ecrire un fichier d'une taille donnee, il ne peut pas. point. Utilise un autre systeme de fichiers. Il n'y a _aucune_ limitation de taille dans la commande cp.
Ce que je trouve plus etonnant c'est qu'une partition FAT considere tous les fichiers comme executables. Est-ce un bug d'interpretation du justement a l'absence de droits, ou alors une necessite pour pouvoir executer les "vrais" programmes ?
Il n'est possible de donner qu'un seul jeu de permissions pour tous les fichiers reguliers d'un systeme de fichiers vfat. Vois le man mount.
Merci pour toutes vos reponses ! Je n'ai pu les tester que ce matin, decalage horaire oblige.
J'ai essaye le tar, mais ca n'a pas marche. Liste d'arguments trop longue encore une fois...

Du coup, j'ai cree un petit script perl, qui marche. L'idee est la meme que celle exposee dans vos reponses: au lieu de traiter tous les fichiers d'un coup, il faut les traiter un par un. Voila ce que donne le code:
#!/usr/bin/perl -w

use File::Copy;
use strict;

my @files;
my $files;
my ($origpath,$destpath);

# On recupere les repertoires d'origine de destination en lisant la liste d'arguments du script
$origpath = $ARGV[0];
$destpath = $ARGV[1];
chomp($origpath);
chomp($destpath);

# On liste l'ensemble des fichiers contenus dans le repertoire d'execution du script
opendir(FOLD, $origpath);
    @files = readdir(FOLD);
closedir(FOLD);

# Et maintenant, on peut copier les fichiers !
foreach $files (@files) {
    chomp($files);
    if($files =~ /sac$/) {
        print("$origpath/$files --> $destpath/$files ... ");
        File::Copy::copy("$origpath/$files","$destpath/$files") or die("Couldn't copy the file $files: $!");
        print("done\n");
    }
}
Il suffit de fournir le repertoire d'origne et celui de destination, et c'est parti !
Je ne copie qu'un seul type de fichiers dont je connais l'extension (.sac en l'occurence), c'est pourquoi je ne fournis que les repertoires. Mais il est tres simple d'ajouter un argument a l'executer pour ne traiter que le type de fichier voulu.

Petit oubli:
Pour que le script fonctionne, il faut le sauvegarder avec une extension en .pl et le rendre executable.
Et pour plus de souplesse, il faut le placer dans un repertoire ou les executables sont recherches par Fedora... Un repertoire bin, a tout hasard ? Etant le seul utilisateur de ma machine, je me suis cree mon propre repertoire bin dans mon repertoire home, et j'ai rajoute la ligne qui va bien dans mon fichier .bash_profile .
Quelque chose qui ressemble a ca: PATH=$PATH:/home/user/bin

Voila, merci beaucoup pour toutes vos contributions, c'est super sympa !
@+
Pour repondre a ta remarque Anvil, ma limitation ne venait pas de la taille des fichiers, mais de leur nombre. Ils ne font que 300ko.

Je n'ai pas encore consulte le man du mount, mais je vais m'empresser de le faire.

Merci beaucoup