Der Grund ist , weil in bash
, *
enthält keine Dateien , mit einem Punkt beginnen ( .
).
Du kannst rennen
cp A/.* B
Es wird Sie warnen , dass es nicht kopieren .
oder ..
, oder alle Unterverzeichnisse, aber das ist in Ordnung.
Wenn Sie Punktdateien und normale Dateien zusammen kopieren möchten, führen Sie den Befehl aus
cp A/.* A/* B
Du könntest auch rennen
shopt -s dotglob
cp A/* B
das wird funktionieren bash
, aber nicht sh
.
Und wenn Sie nichts dagegen haben, dass auch Unterverzeichnisse kopiert werden, ist dies die einfachste:
cp -R A/ B
Tipp: Wenn Wildcards jemals nicht das tun, was Sie erwarten, versuchen Sie, sie mit Echo auszuführen, z
$ 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
-r
. Ohne-r
wird es nur die Verzeichnisse überspringen.-R
sollte auch gut funktionieren. Wenn Sie denken, dass es falsch ist, erklären Sie bitte, warum.Wenn Bash, können Sie einstellen,
dotglob
bevor Sie kopierenOder eine Programmiersprache
Wenn Sie dotglob nicht einstellen möchten, nur
quelle
A
sind ausgeblendet. Er will das nur kopieren.Was Sie suchen, ist mehr im Sinne von:
Dies entspricht allen Punktedateien, jedoch nicht "." oder "..". Die meisten der oben genannten Lösungen sind in Ordnung, solange Sie nicht rekursiv arbeiten. Aber sobald du etwas machen willst wie:
Ohne das Auslassen von ".." kopieren Sie alles aus dem übergeordneten Verzeichnis nach unten, auch Nicht-Punktedateien.
quelle
.a
oder sind, übersehen.x
. Das kürzeste Globbing Muster Ich habe festgestellt , dass Streichhölzer jede Punktdatei mit Ausnahme.
und..
ist.[^.]*
.Ich habe gerade Folgendes ausprobiert und es funktioniert einfach ...
quelle
A/.
undA/..
als Parameter ancp
, was problematisch sein könnte, falls OP auch Verzeichnisse kopieren muss (mitcp -r
)Das ist nicht
cp
die Schuld , es ist bash: bash wird*
in allen nicht versteckten (dh nicht mit.
) Dateien erweitert.Bash wird
.*
(A/.*
in Ihrem Fall also) mit allen Dateien erweitert, die mit beginnen.
, enthält aber leider auch.
und..
(aktuelle und übergeordnete Verzeichnisse), die Sie wahrscheinlich überspringen möchten. (Beachten Sie, dass andere Shells, wie zsh, sie nicht einschließen würden, und IIRC schlägt ebenfalls zu, nachdem einige Optionen festgelegt wurden.)Eine einfache Lösung könnte darin bestehen, Dateien zu entfernen
.
und..
aus Dateien zu entfernen.*
, die auf (sehr) hackige Weise wie folgt übereinstimmen:oder dieses (wahrscheinlich sauberer: es verwendet
find
, um die zu kopierenden Dateien zu finden):Aber Sie werden wahrscheinlich sauberere Lösungen finden.
quelle
for loop
zusätzlichengrep
Prozess erstellen , um einen Job wie diesen zu erledigencp A/.*
?cp
ignoriert das "." und ".." Verzeichnisse.Wenn alle mit einem Punkt beginnen, verwenden Sie einfach
A/.*
:Hoffe das hilft!
quelle
Sie können dieses Skript verwenden
quelle
Kopieren:
Liste:
liste dateien ohne absteigende verzeichnisse auf:
quelle
Sie müssen ausschließen. und .. aus der Dateiliste an cp übergeben!
Das ist sicher:
quelle
Dies ist ein alter Thread ... aber ich war immer in der Lage, alle Dateien zu kopieren. Einschließen von Dateien / Ordnern, die mit "." Beginnen
Beispiel kopiert alle Dateien und Ordner:
cp -aup /root/.* / backup / root /
quelle