Il motivo è perché in bash
, *
non include i file che iniziano con il punto (.
).
Puoi correre
cp A/.* B
Ti avviserà che non ha copiato .
o ..
, o qualsiasi sottodirectory, ma va bene.
Oppure, se vuoi copiare file punto e file normali insieme, esegui
cp A/.* A/* B
Potresti anche correre
shopt -s dotglob
cp A/* B
che funzionerà in bash
, ma non sh
.
E se non ti dispiace che vengano copiate anche le sottodirectory, allora questa è la più semplice:
cp -R A/ B
Suggerimento:se mai i caratteri jolly non fanno ciò che ti aspetti, prova a eseguirlo con echo, ad es.
$ 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
Se bash, puoi impostare dotglob
prima di copiare
shopt -s dotglob
cp A/* /destination
O un linguaggio di programmazione
$ ruby -rfileutils -e 'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'
Se non vuoi impostare dotglob, basta
cp A/.* /destination 2>/dev/null
Quello che stai cercando è più simile a:
cp A/.??* B/
Questo corrisponderà a tutti i dotfile, ma non a "." o "..". La maggior parte delle soluzioni di cui sopra va bene finché non lavori in modo ricorsivo. Ma non appena vuoi fare qualcosa del tipo:
cp -R A/.??* B/
Senza omettere ".." copierai tutto dalla directory principale in giù, inclusi i file non dot.