Der Grund liegt darin, dass in bash
, *
enthält keine Dateien, die mit einem Punkt beginnen (.
).
Sie können rennen
cp A/.* B
Es wird Sie warnen, dass .
nicht kopiert wurde oder ..
, oder irgendwelche Unterverzeichnisse, aber das ist in Ordnung.
Oder, wenn Sie Punktdateien und normale Dateien zusammen kopieren möchten, führen Sie
auscp A/.* A/* B
Sie könnten auch rennen
shopt -s dotglob
cp A/* B
was in bash
funktionieren wird , aber nicht sh
.
Und wenn es Ihnen nichts ausmacht, dass auch Unterverzeichnisse kopiert werden, dann ist das am einfachsten:
cp -R A/ B
Tipp:Wenn Platzhalter einmal nicht das tun, was Sie erwarten, versuchen Sie es mit echo, z. B.
$ 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
Bei Bash können Sie dotglob
setzen bevor Sie kopieren
shopt -s dotglob
cp A/* /destination
Oder eine Programmiersprache
$ ruby -rfileutils -e 'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'
Wenn Sie dotglob nicht setzen möchten, einfach
cp A/.* /destination 2>/dev/null
Was Sie suchen, entspricht eher dem Folgenden:
cp A/.??* B/
Dies stimmt mit allen Punktdateien überein, aber nicht mit "." oder "..". Die meisten der oben genannten Lösungen sind in Ordnung, solange Sie nicht rekursiv arbeiten. Aber sobald Sie etwas tun möchten wie:
cp -R A/.??* B/
Ohne ".." wegzulassen, kopieren Sie alles aus dem übergeordneten Verzeichnis nach unten, einschließlich Nicht-Punktdateien.