J'ai un grand répertoire contenant des sous-répertoires et des fichiers que je souhaite copier récursivement.
Existe-t-il un moyen de dire cp
qu'il doit effectuer l'opération de copie par ordre de taille de fichier, afin que les plus petits fichiers soient copiés en premier?
Réponses:
Cela fait tout le travail en une seule fois - dans tous les répertoires enfants, le tout dans un seul flux sans aucun problème de nom de fichier. Il copiera du plus petit au plus grand chaque fichier que vous avez. Vous devrez le faire
mkdir ${DESTINATION}
s'il n'existe pas déjà.Mais tu sais quoi? Ce que cela ne fait pas, c'est des répertoires enfants vides . Je pourrais faire une redirection sur ce pipeline, mais ce n'est qu'une condition de concurrence qui attend de se produire. Le plus simple est probablement le meilleur. Alors faites-le juste après:
Ou, puisque Gilles fait un très bon point dans sa réponse pour préserver les autorisations de répertoire, je devrais essayer aussi. Je pense que cela le fera:
Je serais prêt à parier que c'est plus rapide que de
mkdir
toute façon.la source
Voici une méthode rapide et sale à utiliser
rsync
. Pour cet exemple, je considère que tout ce qui est inférieur à 10 Mo est "petit".Transférez d'abord uniquement les petits fichiers:
rsync -a --max-size=10m srcdir dstdir
Transférez ensuite les fichiers restants. Les petits fichiers précédemment transférés ne seront pas recopiés sauf s'ils ont été modifiés.
rsync -a srcdir dstdir
De
man 1 rsync
Bien sûr, l'ordre de transfert fichier par fichier n'est pas strictement du plus petit au plus grand, mais je pense que c'est peut-être la solution la plus simple qui répond à l'esprit de vos exigences.
la source
--copy-dest=DIR
et / ou--compare-dest=DIR
je pense. Je ne sais que parce que j'ai dû--hard-dereference
m'y ajoutertar
après avoir posté ma propre réponse parce que je manquais les liens. Je pense quersync
se comporte en fait plus spécifique aux systèmes de fichiers locaux avec ces autres de toute façon - je l'utilisais avec des clés USB et cela inonderait le bus à moins que je ne fixe une limite de bande passante. Je pense que j'aurais dû utiliser l'un de ces autres à la place.Pas
cp
directement, c'est bien au-delà de ses capacités. Mais vous pouvez vous arranger pour appelercp
les fichiers dans le bon ordre.Zsh permet commodément de trier les fichiers par taille avec un qualificatif glob . Voici un extrait zsh qui copie les fichiers dans un ordre croissant de taille de dessous
/path/to/source-directory
en dessous/path/to/destination-directory
.Au lieu d'une boucle, vous pouvez utiliser la
zcp
fonction. Cependant, vous devez d'abord créer les répertoires de destination, ce qui peut être fait dans un oneliner cryptique.Cela ne préserve pas la propriété des répertoires source. Si vous le souhaitez, vous devrez enrôler un programme de copie approprié tel que
cpio
oupax
. Si vous faites cela, vous n'avez pas besoin d'appelercp
ouzcp
en plus.la source
Je ne pense pas qu'il y ait moyen
cp -r
de le faire directement. Comme il peut s'écouler une période de temps indéterminée avant d'obtenir une solutionfind
/ assistantawk
, voici un script perl rapide:Utilisez ceci:
./whatever.pl /src/path /dest/path
Les arguments doivent être tous deux des chemins absolus ;
~
, ou toute autre chose que le shell étend à un chemin absolu est très bien.Si vous ajoutez un troisième argument (n'importe quoi, à l'exception d'un littéral
0
), au lieu de le copier, il imprimera pour standardiser un rapport de ce qu'il ferait, avec des tailles de fichiers en octets ajoutées, par exempleNotez qu'ils sont classés par ordre croissant de taille.
La
cp
commande sur la ligne 34 est une commande shell littérale, vous pouvez donc faire ce que vous voulez avec les commutateurs (je viens de l'utiliser-a
pour préserver tous les traits).File::Find
etFile::Basename
sont les deux modules de base, c'est-à-dire qu'ils sont disponibles dans toutes les installations de perl.la source
cp - copy smallest files first?
mais le titre de l'article est justecopy smallest files first?
Quoi qu'il en soit, les options ne font jamais de mal est ma philosophie, mais quand même, vous et David êtes les seuls à avoir utilisécp
et vous êtes le seul à l'avoir réussi.cp
était parce que c'est le moyen le plus simple de conserver les caractéristiques des fichiers * nix dans le Perl (orienté multiplateforme). La raison pour laquelle la barre de votre navigateur le ditcp -
est due à une fonctionnalité (IMO goofy) SE dans laquelle le plus populaire des tags sélectionnés apparaît préfixé au titre réel.pearl
sortir des boiseries ici.une autre option serait d'utiliser cp avec la sortie de du:
Cela pourrait toujours être fait sur une seule ligne, mais je l'ai divisé pour que vous puissiez le lire
la source