Je vous suggère d'utiliser rsync au lieu de cp, si vous le pouvez, il a l'option -m qui exclura les dossiers vides, exemple :
rsync -am <origin> <destination>
Explication de la commande dans EXPLAINSHELL.com
J'utilise l'option -a car elle effectue de nombreuses actions par défaut, mais si vous le souhaitez, vous pouvez également utiliser l'option -r, qui définira uniquement le mode récursif.
[AJOUTER un commentaire]
Je ne connais pas de moyen de le faire avec cp, du moins la page de manuel ne montre aucune option qui le fera pour vous. Vous pouvez probablement faire une solution plus complexe en utilisant la commande find
pour trouver la liste des fichiers/répertoires à copier, puis la transmettre à cp, mais ce serait beaucoup plus compliqué que rsync. rsync est même à peu près standard dans de nombreux Linux
cp
n'a en effet pas d'option pour obtenir uniquement des fichiers, mais comme l'a dit berserck, vous pouvez utiliser find
avec cp
. En fait, c'est très simple :
# Copy only files
find /path/to/file -type f -execdir cp "{}" /dest/path ";"
Ou :
# Copy everything except directories
find /path/to/file -not -type d -execdir cp "{}" /dest/path ";"
Explication
find
est l'outil qui cherchera les fichiers que vous voulez. Dans la première option, nous définissons -type f
pour renvoyer uniquement les fichiers normaux. Dans la deuxième option, nous définissons le -not -type d
pour obtenir tout sauf les répertoires. find
exécute les arguments passés à -execdir
remplaçant {}
avec une entrée de résultat à la fois et arrête la commande lorsque ;
est trouvé (;
doit être échappé \;
ou ";"
, ou le shell pourrait le développer).
-execdir
exécutera la commande ayant le dossier du fichier comme "répertoire de travail" et il est préférable au lieu de -exec
, vérifiez ci-dessous.
Le -type
documentation des options :
-type c
Le fichier est de type c :
b :bloc (tamponné) spécial
c :caractère spécial (non tamponné)
d :répertoire
p :canal nommé (FIFO)
f :fichier normal
l :lien symbolique; ceci n'est jamais vrai si l'option -L ou l'option -follow est active, sauf si le lien symbolique est rompu. Si vous souhaitez rechercher des liens symboliques lorsque -L est activé, utilisez -xtype.
s :socket
D :porte (Solaris)
Le -not
documentation des options :
! expression
Vrai si expr est faux. Ce caractère aura également généralement besoin d'être protégé contre l'interprétation par le shell.
-pas expr
Pareil que ! expr, mais non conforme à POSIX.
Le -execdir
documentation des options :
-exec commande;
Exécutez la commande ; true si le statut 0 est renvoyé. Tous les arguments suivants à rechercher sont considérés comme des arguments de la commande jusqu'à un argument composé de ';' est rencontré. La chaîne '{}' est remplacée par le nom du fichier en cours de traitement partout où il apparaît dans les arguments de la commande [...]. Ces deux constructions peuvent avoir besoin d'être échappées (avec un '\') ou entre guillemets pour les protéger de l'expansion par le shell. La commande spécifiée est exécutée une fois pour chaque fichier correspondant. La commande est exécutée dans le répertoire de départ. Il existe des problèmes de sécurité inévitables liés à l'utilisation de l'action -exec ; vous devriez utiliser l'option -execdir à la place.
-execdir commande;
Comme -exec, mais la commande spécifiée est exécutée à partir du sous-répertoire contenant le fichier correspondant , qui n'est normalement pas le répertoire dans lequel vous avez commencé la recherche. Il s'agit d'une méthode beaucoup plus sécurisée pour invoquer des commandes, car elle évite les conditions de concurrence lors de la résolution des chemins vers les fichiers correspondants. [...] Si vous utilisez cette option, vous devez vous assurer que votre variable d'environnement $PATH ne fait pas référence à '.'; sinon, un attaquant peut exécuter toutes les commandes de son choix en laissant un fichier nommé de manière appropriée dans un répertoire dans lequel vous exécuterez -execdir. Il en va de même pour les entrées de $PATH qui sont vides ou qui ne sont pas des noms de répertoire absolus.
https://linux.die.net/man/1/find