Quelle est la différence entre cp -R foo / et cp -R foo / *

2

J'ai remarqué que chaque fois que j'utilise une commande, cp -R foo/*je copie tout, sauf les fichiers tels que .envou probablement.gitignore

La solution consiste à utiliser cp -R foo/car il gère l’ensemble du répertoire, mais cela ne change pas le fait que je ne comprends toujours pas le comportement de l’utilisation d’un *caractère.

Pourquoi un *personnage ne va pas attraper un fichier comme .env?

Le système d'exploitation est Debian

Bartłomiej Sobieszek
la source

Réponses:

5
  • cp -R foo/ copie récursivement tout sous foo/
  • cp -R foo/*copie récursivement tous les fichiers et répertoires correspondants foo/*. Et par défaut, les noms avec un point ne sont pas inclus ( ls *ne les listera pas non plus). Ceci est expliqué ici (ainsi que quelques autres petits détails sur les points principaux).

Outre la gestion des fichiers comportant des points, une autre différence réside dans le fait que cp -R foo/*les fichiers et les répertoires individuels sont copiés dans foo/le répertoire cible, tandis cp -R foo/que ceux-ci sont copiés foo/dans le répertoire cible (vous obtenez donc un niveau de répertoire supplémentaire).

xénoïde
la source
3

Par défaut, globbing dans bash n'inclut pas les noms de fichiers commençant par " . So" lorsque vous indiquez que *vous demandez une copie récursive sans les fichiers commençant par " .". Lorsque vous ne spécifiez pas, *tout est copié, y compris les .fichiers " ".

Vishal Shinde
la source
Ce que vous dites est (je suppose) basé sur ce que j’ai écrit, mais je ne l’ai jamais vu dans aucune documentation. Par exemple, tldp.org indique que le caractère astérisque "peut représenter n’importe quel nombre de caractères (y compris zéro, en d’autres termes, zéro Si vous spécifiez un "cd *", il utilisera "cda", "cdrom", "cdrecord" et tout ce qui commence par "cd", y compris "cd" lui-même. "m * l" pourrait être modifié , mull, ml, et tout ce qui commence par un m et se termine par un l. ".
Commentaires
Consultez ci-dessous pour plus de détails sur same
Vishal Shinde
homme 7 glob .....
Vishal Shinde
À titre indicatif, vous pouvez utiliser rsync pour tout copier, y compris les fichiers et les répertoires de points.
Paulo
J'aimerais souligner que si vous agissiez en tant que superutilisateur, les fichiers de points seraient alors récupérés par le *, étant donné que les fichiers ne sont généralement pas cachés root.
Nevin Williams
2

Outre les autres réponses que vous avez, il existe quelques autres cas où foo/et qui foo/*pourraient être différents (pas seulement les fichiers commençant par .). En outre, si vous souhaitez que les fichiers qui commencent par .correspondre à votre glob, vous pouvez également l'activer avec shopt -s dotglob.

Le premier est le cas , il n'y a aucune entrée dans foo/et vous n'avez pas activé nullglobpuis foo/*sera renvoyé comme un littéral passé à cp. Puisque (dans ce cas), il n’ya pas de source foo/* cpqui se plaindrait, alors qu’il cp -R foo/faudrait toujours au moins foo/copier. Si vous activez nullglobcette option, elle foo/*ne sera plus étendue à rien, de sorte que vous manquerez d'un argument cp.

Un autre cas à considérer est s'il y a beaucoup d'entrées dans foo/. Le shell développe le glob, puis appelle le processus, mais si le glob se développe en trop d'arguments, vous obtiendrez une erreur. Avec cp -R foo/vous n'avez que 2 arguments (bien que vous ayez probablement une cible ailleurs).

Eric Renouf
la source