Souhaitez copier tous les fichiers d'une structure de répertoires dans un répertoire spécifique uniquement si le fichier n'y existe pas déjà.
Vous avez la première partie de cette question de débordement de pile :
find . -type f -exec cp {} /target-directory \;
Comment puis-je vérifier si le fichier existe ou non? Sinon, copiez le fichier, sinon sautez.
Vous pouvez utiliser -u
pour passer de la commande cp
:
copier uniquement lorsque le fichier SOURCE est plus récent que le fichier de destination ou lorsque le fichier de destination est manquant
ou utilisez la commande rsync
avec --ignore-existing
:
ignorer la mise à jour des fichiers existant sur le récepteur
Exemple:
rsync --ignore-existing source/* destination/
Votre commande d'origine peut être réécrite comme suit:
find . -type f -exec bash -c 'test -e /target-directory/"$1" || cp "$1" /target-directory' sh {} \;
La clé ici est que nous appelons Shell avec des commandes spécifiques et passons le fichier trouvé en argument $1
. Si test -e /target-directory/"$1"
échoue, cela signifie que le fichier n'existe pas. Dans ce cas, cp
copiera le fichier.
En général, on peut utiliser d'autres commandes, à condition que la commande puisse vérifier l'existence d'un fichier. Quelques autres alternatives:
/usr/bin/realpath -e /target-directory/"$1" > /dev/null || cp "$1" /target-directory
stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"
Lisez man cp
et utilisez l’option --no-clobber
pour cp
.