Comment copier un répertoire entier dans un répertoire du même nom sans remplacer le contenu du répertoire de destination? (au lieu de cela, j'aimerais ajouter au contenu du dossier de destination)
Comment copier un répertoire entier dans un répertoire du même nom sans remplacer le contenu du répertoire de destination? (au lieu de cela, j'aimerais ajouter au contenu du dossier de destination)
Réponses:
Utilisez rsync
et passez -u
si vous voulez mettre à jour uniquement les fichiers les plus récents du répertoire d'origine ou --ignore-existing
ignorer tous les fichiers déjà présents dans la destination.
rsync -au /local/directory/ host:/remote/directory/
rsync -a --ignore-existing /local/directory/ host:/remote/directory/
(Notez le /
côté source: sans cela rsync
, il créerait /remote/directory/directory
.)
--ignore-existing
ajoute sans remplacer, quelle perte de données voyez-vous?
rsync
facilement disponible .... (comme Win32-OpenSSH)
--rsync-path
est nécessaire)
scp écrasera les fichiers si vous avez des droits en écriture.
En d'autres termes: vous pouvez faire scp
en sorte que les fichiers soient ignorés en supprimant temporairement les autorisations d'écriture sur ces fichiers (si vous êtes le propriétaire des fichiers, c'est-à-dire).
scp -r user@server.com:/location/of/files/* /local/location/
Vous ne pouvez copier que les nouveaux fichiers par date. Utilisationfind
scp `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/
Si vous pouvez rendre le contenu du fichier de destination en lecture seule:
find . -type f -exec chmod a-w '{}' \;
avant de courir scp
(il va se plaindre et sauter les fichiers existants).
Et modifiez-les ensuite ( chmod +w
pour obtenir une valeur basée sur umask). Si tous les fichiers n’ont pas l’autorisation d’écrire en fonction de votre umask, vous devrez peut-être stocker ces autorisations pour pouvoir les restaurer.
(La réponse de Gilles écrase les fichiers existants si, localement, ils sont plus récents, j'ai perdu de précieuses données de cette façon. Je ne comprends pas pourquoi cette réponse fausse et nuisible a autant de votes positifs).
rsync --ignore-existing
avez-vous perdu des données?
find: missing argument to '-exec'
utilisant cette commande, et avait plutôt à utiliser: find . -type f -exec chmod a-w {} \;
. Mon linux est mauvais, ymmv.
find . -type f -exec chmod a-w {} \;
J'ai eu une tâche similaire, dans mon cas , je ne pouvais pas utiliser rsync
, csync
ou FUSE parce que mon stockage a seulement SFTP. rsync
impossible de changer la date et l’heure du fichier, certains autres utilitaires (du type csync
) m’ont montré d’autres erreurs: « Impossible de créer un fichier temporaire Clock skew détecté ».
Si vous avez accès au serveur de stockage, installez-le openssh-server
ou lancez-le en rsync
tant que démon ici.
Dans mon cas, je ne pouvais pas faire cela et la solution était: lftp . lftp
L'utilisation de Syncronization est la suivante:
lftp -c "open -u login,password sftp://sft.domain.tld/; \
mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"
/src/folder
- est le dossier sur mon PC, /rem/folder
- est sftp://sft.domain.tld/rem/folder
.
Vous pouvez trouver des pages de manuel par le lien: http://lftp.yar.ru/lftp-man.html
Pour copier tout un tas de fichiers, il est plus rapide de les archiver. En utilisant -k, vous évitez également que tar écrase les fichiers lors de sa décompression sur le système cible.
tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>'
scp
écrase les fichiers et il n’ya pas d’interrupteur pour l’interrompre, mais vous pouvez copier des choses comme vous le voulez, faire le scp, puis copier les fichiers existants. Exemples:
Copiez tous les fichiers existants en chemin
mkdir original_files ; cp -r * original_files/
Copier tout en utilisant scp
scp -r user@server:dir/* ./
Copiez les fichiers originaux sur tout ce que scp a écrit:
cp -r original_files/* ./
Pour ce faire, vous pouvez également effectuer une opération ls
dans le dossier de destination:
Sur le dossier de destination distant:
ls | awk '{print "mv " $1 " ../copied_data/"}' > mv_copied_data
scp mv_copied_data user@source.server.com:/path/to/source/folder
Sur source:
cd /path/to/source/folder
chmod 777 mv_copied_data
./mv_copied_data
Sur la destination:
scp -r user@source.server.com:/path/to/source/folder /path/to/destination/foldeer
-
>
nouvelle ligne ou d'autres caractères spéciaux. 3. Coder en dur une boucle for dans un script python. Générer un programme à l'exécution est difficile et délicat (même lorsqu'il est effectué par des programmeurs professionnels), pour de nombreuses raisons. Générer un script shell est encore pire - une idée terrible.