Ich möchte einen Inhalt von Verzeichnis 1 in Verzeichnis 2 kopieren. Ich möchte jedoch nur Dateien (und keine Verzeichnisse) aus meinem Verzeichnis 1 kopieren. Wie kann ich das tun?
cp dir1/* dir2/*
dann habe ich noch das verzeichnisproblem.
Außerdem haben alle meine Dateien keine Erweiterung . wird den Trick nicht tun
cp dir1/* dir2
odercp -t dir2 dir1/*
Antworten:
cp
Verzeichnisse werden nicht kopiert, es sei denn, Sie werden ausdrücklich dazu aufgefordert (--recursive
siehe z. B. sieheman cp
).Hinweis 1:
cp
Wird höchstwahrscheinlich mit einem Status ungleich Null beendet, die Dateien wurden jedoch trotzdem kopiert. Dies kann ein Problem sein , wenn Befehle Verkettungs basierend auf Exit - Codes:&&
,||
,if cp -r dir1/* dir2; then ...
usw. (Dank contrebis für seinen eigenen Kommentar zu diesem Thema )Hinweis 2 :
cp
Erwartet, dass der letzte Parameter ein einzelner Dateiname oder ein einzelnes Verzeichnis ist.*
Nach dem Namen des Zielverzeichnisses sollte wirklich kein Platzhalter stehen .dir2\*
wird von der Shell genauso wie erweitertdir1\*
. Unerwartete Dinge werden passieren:dir2
leer ist und abhängig von Ihrer Shell und Einstellungen:dir2/*
wird wörtlich genommen (auf der Suche nach einer Datei / einem Verzeichnis mit dem Namen*
), was wahrscheinlich auch zu einem Fehler führt, sofern er nicht*
tatsächlich existiert.dir2/*
Es wird nur vollständig aus dem Befehl entfernt und verlassencp dir1/*
. Was je nach Erweiterung vondir1/*
sogar Daten zerstören kann:dir1/*
nur eine Datei oder ein Verzeichnis übereinstimmt, erhalten Sie eine Fehlermeldung voncp
.dir1/*
genau zwei Dateien übereinstimmen, wird eine von der anderen überschrieben ( Bad ).dir/*
mehrere Dateien übereinstimmen und die letzte Übereinstimmung eine ist, wird eine Fehlermeldung angezeigt.dir/*
ein Verzeichnis ist, werden alle anderen Übereinstimmungen in dieses Verzeichnis verschoben.dir2
es nicht leer ist, kommt es wieder darauf an:dir2/*
ein Verzeichnis istdir1/*
und die anderen Übereinstimmungen vondir2/*
in verschoben werden.dir2/*
eine Datei ist, wird wahrscheinlich eine Fehlermeldung angezeigt, es sei denn , esdir1/*
stimmt nur mit einer Datei überein.quelle
$ cp dir1/* dir2
->cp: dir1/isadir is a directory (not copied).
Exits mit Status 1 für mich.cp
tut kopieren Sie die entsprechenden Dateiendir1/*
auf jedem System , das ich überprüfte: Arch Linux, Ubuntu 14.04, OpenBSD 3.9 und 5.5, SuSE Linux 8.1, FreeBSD 6.2, Solaris 8, 9 und 10 (wocp
eigentlich Ausfahrten mit dem Code 2). Dieses Verhalten ist also weder neu (SuSE 8.1 stammt aus dem Jahr 2002) noch auf Linux beschränkt.cp
Beendet mit einem Exit-Code ungleich Null, weil er nicht alles tun konnte, was ihm gesagt wurde. Das heißt nicht, dass es nichts tut .&&
kann dies zu Problemen führen. Ich habe versucht, so etwas zu tun, obwohl ich mich jetzt nicht an den Kontext erinnern kann.*
versteckte Dateien enthalten sind oder wie versteckte Dateien eingeschlossen werden sollen, hängt von der Shell ab. Wenn das*
keine versteckten Dateien enthält, können Sie sie mit abgleichen.*
. Beachten Sie, dass dies.
and..
onbash
unddash
aber nicht on einschließtzsh
. Im Rahmen dieser Antwort können Sie mitcp dir1/* dir1/.* dir2
weil durchkommen.
und..
sind Verzeichnisse und werden nicht kopiert.zsh
kann auch dazu gebracht werden, versteckte Dateien mit einzuschließen*(D)
.Es ist die Shell, die Platzhalter erweitert, nicht die Befehle. Erweitert also
cp dir1/* dir2/*
zuerst die beiden Platzhalter und ruft danncp
das Ergebnis auf. Dies ist anscheinend überhaupt nicht das, was Sie anscheinend erwarten: Je nachdem, wie viele Dateien bereits vorhanden sinddir2
,dir2/*
kann dies zu einem oder mehreren Argumenten führen. Der Befehlcp
weiß nicht, welches seiner Argumente aus der Erweiterung des ersten Musters und welches aus der Erweiterung des zweiten Musters stammt. Es wird erwartet, dass das letzte Argument der Name des Zielverzeichnisses ist. Um alle Dateien aus dem Verzeichnisdir1
in das Verzeichnis zu kopierendir2
, muss das letzte Argument das Verzeichnis seindir2
:Da
*
alle Dateien übereinstimmen, wirdcp
versucht, alle Dateien zu kopieren. Dies schließt Verzeichnisse ein: Verzeichnisse sind auch Dateien. Verzeichnisse werden übersprungen, es wird jedoch ein Fehler gemeldet. Es kopiert den Inhalt spezieller Dateien wie Named Pipes (etwas sollte besser in sie geschrieben werden odercp
blockiert) usw.Um nur reguläre Dateien zu kopieren , müssen Sie den Abgleich einschränken. In zsh können Sie dafür das Glob-Qualifikationsmerkmal verwenden
.
:Andere Muscheln haben das nicht. Mit dem
find
Befehl können Sie nach Dateitypen filtern. Angenommen, Sie verwenden nicht eingebettetes Linux oder Cygwin:Unter Linux, FreeBSD und OSX:
quelle
-maxdepth 1
. Gibt es auch eine Möglichkeit, die ursprüngliche Verzeichnishierarchie im Zielverzeichnis rekursiv zu kopieren und beizubehalten?-maxdepth 1
derfind
Befehl in Unterverzeichnisse zurückkehren, was hier nicht erwünscht war. Wenn Sie den gesamten Verzeichnisbaum einschließlich der Unterverzeichnisse kopieren möchten, ist dies eine völlig andere Frage, und die Antwort ist viel einfacher :cp -a dir1 dir2
.Unten finden Sie den Befehl zum Kopieren der Datei vom Quell- in das Zielverzeichnis.
Gehen Sie zum Quellordner und schreiben Sie den folgenden Befehl:
$ cp fileName destination directory path
Beispiel:
quelle