web-dev-qa-db-fra.com

Copiez chaque fichier d'une structure de répertoire dans un chemin spécifique uniquement si le fichier n'existe pas déjà

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.

8
mr au

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/
13
Ravexina

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"
3

Lisez man cp et utilisez l’option --no-clobber pour cp.

0
waltinator