Kopieren Sie Dateien aus einem Verzeichnis in ein vorhandenes Verzeichnis

248

In Bash muss ich das tun:

  1. Nehmen Sie alle Dateien in einem Verzeichnis

  2. Kopieren Sie sie in ein vorhandenes Verzeichnis

Wie mache ich das? Ich habe es versucht cp -r t1 t2(sowohl t1 als auch t2 sind vorhandene Verzeichnisse, t1 enthält Dateien), aber es wurde ein Verzeichnis namens t1 in t2 erstellt. Ich möchte das nicht. Ich brauche die Dateien in t1, um direkt in t2 zu gelangen. Wie mache ich das?

David Chang
quelle
11
Warum war das geschlossen? Es ist willkürlich, ob ein Bash-Befehl ein eingebauter oder externer Befehl ist (z. B. printf ist auf den meisten Systemen als beides vorhanden), sodass cpFragen durchaus als bashFragen angesehen werden können, bei denen es sich um eine Programmiersprache handelt. Ich habe noch nie eine Python-Frage gesehen, die über das Schließen von Dateikopien spricht.
Ciro Santilli 法轮功 冠状 病 六四 事件 9
Werfen
theGiallo
Ich bin auf der Suche nach einer Erinnerung an die Syntax des Bash-Shell-Kopierbefehls angekommen und freue mich, Ihnen mitteilen zu können, dass diese Befehle bei meiner Windows-Installation auch gegen das zugrunde liegende NTFS-Dateisystem zu funktionieren scheinen.
David A. Gray

Antworten:

396

Was Sie wollen ist:

cp -R t1/. t2/

Der Punkt am Ende weist ihn an, den Inhalt des aktuellen Verzeichnisses zu kopieren, nicht das Verzeichnis selbst. Diese Methode umfasst auch versteckte Dateien und Ordner.

Nick
quelle
2
Ich mag diese Syntax wirklich, aber aus irgendeinem Grund funktioniert sie nicht mv. Weiß jemand warum?
Martin von Wittich
2
Tolle. Wo ist das dokumentiert? Ist es POSIX oder Erweiterung?
Ciro Santilli 法轮功 冠状 病 六四 事件 9
9
@CiroSantilli you 事件 法轮功 包 包 轩 Wenn Sie ein Verzeichnis kopieren, erstellt cp ein Verzeichnis und kopiert alle Dateien in dieses Verzeichnis. Wenn Sie den vorgetäuschten Ordner "." Verwenden, der mit dem Verzeichnis identisch ist, in dem er sich befindet, verhält sich die Kopie folgendermaßen. Angenommen, t1 enthält eine Datei namens "file". cp führt die Operation aus, die "cp t1 /./ file t2 /./" entspricht. Es kopiert den Ordner ".", Kopiert aber Dateien in t2s "." Ordner entfernt das "./", da "t2 /./" dasselbe ist wie "t2 /". Technisch bedeutet dies, dass es sich um ein in POSIX integriertes Verhalten handelt ... aber wahrscheinlich nicht so, wie Sie es erwartet haben!
Streik
35

Wenn Sie etwas aus einem Verzeichnis in das aktuelle Verzeichnis kopieren möchten , gehen Sie folgendermaßen vor:

cp dir1/* .

Dies setzt voraus, dass Sie nicht versuchen, versteckte Dateien zu kopieren.

Karl Giesing
quelle
20
Vermisst versteckte Dateien.
Ciro Santilli 9 冠状 病 六四 事件 9
1
Scheitert auch für eine große Anzahl von Dateien (weil '*' nicht auf unendlich viele Dateien erweitert werden kann ..) y
moritzschaefer
32
cp dir1/* dir2

Oder wenn Sie Verzeichnisse in dir1 haben, die Sie ebenfalls kopieren möchten

cp -r dir1/* dir2
Bertrand Marron
quelle
3
Abhängig davon, wie Ihre Shell konfiguriert ist, müssen Sie wahrscheinlich "dir1 / * dir1 /.*" anstelle von "dir1 / *" verwenden, wenn Sie auch versteckte Dateien abfangen möchten.
ssokolow
2
Das Kopieren dir1/.*ist keine gute Idee, da es dir1 / .. kopiert (dh das übergeordnete Verzeichnis des Verzeichnisses, das Sie tatsächlich kopieren möchten). Es kopiert auch dir1 /. Das ist in Ordnung, außer dass es bereits (meistens) kopiert wurde, also machst du die Arbeit zweimal.
Gordon Davisson
1
Sie können das dir1/.*Problem mit / versteckten Dateien umgehen, indem Sie in das Verzeichnis kopieren, aus dem Sie kopieren möchten, und dann darauf verweisen als .. Wenn Sie also alle Dateien einschließlich versteckter Dateien aus einem Verzeichnis in ein vorhandenes Verzeichnis kopieren möchten, können Sie: cd [source dir], cp . [path to destination dir, with no trailing slash].
RobW
8

Angenommen, t1 ist der Ordner mit den darin enthaltenen Dateien und t2 ist das leere Verzeichnis. Was Sie wollen, ist ungefähr so:

sudo cp -R t1/* t2/

Denken Sie daran, dass für das erste Beispiel t1 und t2 die vollständigen Pfade oder relativen Pfade sein müssen (je nachdem, wo Sie sich befinden). Wenn Sie möchten, können Sie zum leeren Ordner (t2) navigieren und dies tun:

sudo cp -R t1/* ./

Oder Sie können zu dem Ordner mit den Dateien (t1) navigieren und dies tun:

sudo cp -R ./* t2/

Hinweis: Das * -Zeichen (oder der Platzhalter) steht für alle Dateien und Ordner. Das -R-Flag bedeutet rekursiv (alles in allem).

Konkret
quelle
2
cp -R t1/ t2

Der abschließende Schrägstrich im Quellverzeichnis ändert die Semantik geringfügig, sodass der Inhalt kopiert wird, nicht jedoch das Verzeichnis selbst. Es vermeidet auch die Probleme mit Globbing und unsichtbaren Dateien, die Bertrands Antwort hat (beim Kopieren t1/*fehlen unsichtbare Dateien, beim Kopieren von "t1 / * t1 /. *" - Kopien von t1 /. Und t1 / .., die Sie nicht möchten).

Gordon Davisson
quelle
Ihre Lösung funktioniert nicht, zumindest nicht auf meiner Installation (Ubuntu 12.10) $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 (leider kein Codeformat in Kommentaren, lesbare Version unter pastebin.com/yszSxV6G )
zpon
2

Abhängig von einigen Details müssen Sie möglicherweise Folgendes tun:

r=$(pwd)
case "$TARG" in
    /*) p=$r;;
    *) p="";;
    esac
cd "$SRC" && cp -r . "$p/$TARG"
cd "$r"

... dies ändert sich im Grunde genommen in das SRC-Verzeichnis und kopiert es auf das Ziel. Anschließend kehren Sie zu dem Zeitpunkt zurück, an dem Sie begonnen haben.

Die zusätzliche Aufregung besteht darin, relative oder absolute Ziele zu handhaben.

(Dies hängt nicht von der subtilen Semantik des cpBefehls selbst ab ... darüber, wie er Quellenspezifikationen mit oder ohne nachfolgendem / ... behandelt, da ich nicht sicher bin, ob diese über GNU cpund mich hinaus stabil, portabel und zuverlässig sind Ich weiß nicht, ob dies auch in Zukunft so bleibt.

Jim Dennis
quelle
1

In einigen Verzeichnissen wird dies als voll verwendet, da alle Inhalte von "Ordner1" in das neue Verzeichnis "Ordner2" in einem Verzeichnis kopiert werden.

$ (pwd) erhält den Pfad für das aktuelle Verzeichnis.

Beachten Sie den Punkt (.) Nach Ordner1, um den gesamten Inhalt in Ordner1 abzurufen

cp -r $(pwd)/folder1/. $(pwd)/folder2
Bidyashish Kumar
quelle