La raison est que dans bash
, *
n'inclut pas les fichiers commençant par un point (.
).
Vous pouvez courir
cp A/.* B
Il vous avertira qu'il n'a pas copié .
ou ..
, ou n'importe quel sous-répertoire, mais ça va.
Ou, si vous voulez copier des fichiers de points et des fichiers normaux ensemble, exécutez
cp A/.* A/* B
Vous pouvez également courir
shopt -s dotglob
cp A/* B
qui fonctionnera en bash
, mais pas sh
.
Et si cela ne vous dérange pas que les sous-répertoires soient également copiés, alors c'est le plus simple :
cp -R A/ B
Astuce :Si jamais les caractères génériques ne font pas ce que vous attendez, essayez de les exécuter avec echo, par exemple
$ echo A/*
A/file1 A/file2
$ echo A/.*
A/. A/.. A/.hidden1 A/.hidden2
$ echo A/.* A/*
A/. A/.. A/.hidden1 A/.hidden2 A/file1 A/file2
$ shopt -s dotglob
$ echo A/*
A/file1 A/file2 A/.hidden1 A/.hidden2
Si bash, vous pouvez définir dotglob
avant de copier
shopt -s dotglob
cp A/* /destination
Ou un langage de programmation
$ ruby -rfileutils -e 'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'
Si vous ne voulez pas définir dotglob, juste
cp A/.* /destination 2>/dev/null
Ce que vous recherchez est plus dans le sens de :
cp A/.??* B/
Cela correspondra à tous les fichiers de points, mais pas à "." ou "..". La plupart des solutions ci-dessus conviennent tant que vous ne travaillez pas de manière récursive. Mais dès que vous voulez faire quelque chose comme :
cp -R A/.??* B/
Sans omettre "..", vous copierez tout depuis le répertoire parent vers le bas, y compris les fichiers non-dot.