J'espérais:
cp -R src/prog.js images/icon.jpg /tmp/package
donnerait une structure symétrique dans le répertoire de destination:
/tmp
|
+-- package
|
+-- src
| |
| +-- prog.js
|
+-- images
|
+-- icon.jpg
mais à la place, les deux fichiers sont copiés dans / tmp / package. Un exemplaire à plat. (Ceci est sur OSX).
Y a-t-il une fonction bash simple que je peux utiliser pour copier tous les fichiers, y compris les fichiers spécifiés par joker (par exemple src / *. Js) à leur place dans le répertoire de destination. Un peu comme "pour chaque fichier, exécutez mkdir -p $(dirname "$file"); cp "$file" $(dirname "$file")
", mais peut-être une seule commande.
Ceci est un fil pertinent, ce qui suggère que ce n'est pas possible. La solution de l'auteur ne m'est pas si utile cependant, car je voudrais simplement fournir une liste de fichiers, joker ou non, et les faire tous copiés dans le répertoire de destination. IIRC MS-DOS xcopy le fait, mais il ne semble pas y avoir d'équivalent pour cp.
cp --parents
est une option illégale dans OSX (BSD cp), maisgcp
(GNU cp) fonctionne bien. S'il n'est pas encore dans votre système, utilisezbrew install coreutils
. U aura de nombreux utils avec le préfixe g.cp -R --parents
etrsync -rR
copie les fichiers et les répertoires de manière relative.Une manière:
la source
-C
option pour faire le chdir pour vous -tar cf - _files_ | tar -C /dest xf -
ou quelque chose comme ça.Sinon, si vous êtes old-school, utilisez cpio:
De toute évidence, vous pouvez filtrer la liste de fichiers à votre guise.
L'option '-p' est pour le mode 'pass-through' (par opposition à '-i' pour l'entrée ou '-o' pour la sortie). Le '-v' est détaillé (liste les fichiers au fur et à mesure qu'ils sont traités). Le '-m' préserve les temps de modification. Le '-B' signifie utiliser 'gros blocs' (où les gros blocs font 5120 octets au lieu de 512 octets); il est possible que cela n'ait aucun effet ces jours-ci.
la source
-print0
avec la combinaison d'--null
options pour ne pas rompre avec les caractères spéciaux et autres:find . -print0 | cpio -pvdmB --null /target
cpio
pour cette tâche. Je suis d'accord que les options-print0
et-null
devraient être utilisées, sinon, à un moment donné, quelqu'un vous donnera des dossiers avec des «caractères spéciaux» (espaces, très probablement) et quelque chose se passera. Non pas que je parle d'expérience personnelle, mais vous pourriez essayer de sauvegarder un tas de fichiers et vous retrouver avec seulement la moitié d'entre eux sauvegardés en raison d'espaces dans les noms de fichiers. (D'accord, je parle d'expérience personnelle.)cpio
comme indiqué si les noms de fichiers contiennent des retours à la ligne - alors vous vous retrouvez normalement avec un message d'erreur indiquant que deux (ou plus) noms de fichiers ne sont pas trouvés pour chaque nouvelle ligne dans un nom de fichier. (Parfois, vous pouvez recevoir moins de messages - mais cela nécessite un soin considérable dans la construction du scénario de test.). Quand j'ai utilisécpio
, il n'y avait pas d'--null
option; Les options à deux tirets ne faisaient pas partie des notations des options SVR4, et le concept de-print0
n'était pas présent dans lesfind
deux. Mais c'était il y a longtemps (au milieu des années 90 par exemple. Avant que Linux ne domine).xargs
dans le mix - il se divise en espace blanc - blancs, tabulations, retours à la ligne. OTOH, je ne sais pas comment ni pourquoi vous feriez ça. Lecpio
manuel GNU sur le mode de sortie est clair sur un nom de fichier par ligne. Le manuel de l'utilisateur du SVR4 (imprimé en 1990) est plus vague:cpio -o
(mode copie) lit l'entrée standard pour obtenir une liste de chemins et copie ces fichiers sur la sortie standard avec le chemin d'accès et les informations d'état. Il y a donc une chance que cela ait cassé des noms aux espaces.L'option -R de rsync fera ce que vous attendez. C'est un copieur de fichiers très riche en fonctionnalités. Par exemple:
Exemples de résultats:
la source
rsync bien sûr! tutoriel ici. et ici
Ou à l' unisson
la source
Essayer...
donc pour ce que vous faisiez à l'origine ...
ou
la source
echo
ou$v
ici. Cette méthode échouera également si le répertoire correspondant n'existe pas dans la destination.