Wie lasse ich "cp" in OS X keine Dateien löschen?

1583
SkippyFlipjack

Hier ist der beste Weg, dies zu beschreiben:

dirA dir1 file1.txt file3.txt dirB dir1 file1.txt file2.txt 

Ich möchte den Inhalt von dirB in dirA kopieren. cp -R dirB/* dirAwürde dir1die Dateien löschen und kopieren, was Folgendes ergibt:

dirA dir1 file1.txt file2.txt 

Aber ich möchte sie zusammenführen (wie unter Windows) und am Ende mit:

dirA dir1 file1.txt file2.txt file3.txt 

Vorschläge? Ich habe es versucht ditto, aber das scheint den rekursiven Teil zu ignorieren und alle Dateien im obersten Ordner abzulegen.

3
http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/cp.1.html ist die Manpage für cp. MDMarra vor 14 Jahren 0
Wie führt Windows diese beiden Dateien mit dem Namen `file1.txt` zusammen? Arjan vor 14 Jahren 1
Ich habe gerade cp -R auf Snow Leopard getestet und es wird genau das, was Sie wollen. Es werden die Dateien in dirA überschrieben, die denselben Namen haben, aber keine Dateien löschen. Raynet vor 14 Jahren 1
Ich danke Raynet, ich hätte nicht gedacht, dass ich dieses Ergebnis habe, aber ich werde es noch einmal überprüfen. Hier geht es um Subversion. Ich muss eine Reihe von Ordnern / Dateien in einem versionsgesteuerten Ordner ablegen, aber es muss alle vorhandenen Dateien dort belassen, damit die .svn-Dateien nicht verstopft werden. SkippyFlipjack vor 14 Jahren 0

7 Antworten auf die Frage

5
Matt Ball

Verwenden Sie nicht cp. Verwenden Sie Rsync .

( Apple dev link .)

2
alphazero

cp ist nicht das Löschen von Dateien.

Es tut dies, indem es dirA / dir1 mit dirB / dir1 überschreibt, anstatt nur die Dateien in diesem Ordner zu kopieren. Das Verhalten ist also Löschen-dann-Kopieren (verglichen mit der Windows-Methode, bei der die Ordner zusammengeführt werden.) SkippyFlipjack vor 14 Jahren 2
cp überschreibt Dateien. Aus Benutzersicht ist dies dasselbe wie das Löschen: Eine überschriebene Datei ist nicht mehr verfügbar. mouviciel vor 14 Jahren 1
2
Doug Harris

Verwenden Sie -iOption cp

 -i Cause cp to write a prompt to the standard error output before copying a file that would overwrite an existing file. If the response from the standard input begins with the character `y' or `Y', the file copy is attempted. (The -i option overrides any previous -n option.) 
Dadurch werden Sie einen Teil davon bekommen - das unbeabsichtigte Zusetzen von Dateien wird zumindest aufhören. `rsync` ist ein besseres Problem bei der Dateisynchronisierung. Doug Harris vor 14 Jahren 1
Ich werde Rsync überprüfen. Das Problem mit -i (danke MarkM, ich habe zuerst die Manpage überprüft: /): Ich habe große Verzeichnisbäume und kann nicht jedes Überschreiben bestätigen. SkippyFlipjack vor 14 Jahren 0
1
user78571

Es muss einen eleganten Weg geben, aber als schnellen Hacken: Entfernen Sie die Schreibberechtigung aus den Dateien in dir1, und führen Sie dann ein cp -r aus.

Ich weiß nicht, ob ich für Einfachheit und Hässlichkeit oder für ... brutale Hässlichkeit abstimmen sollte. Matt Ball vor 14 Jahren 0
0
3498DB

Ich mache etwas Ähnliches mit einem Exportskript. Hier ist der Befehl, den ich verwende:

cp -R demo_files/. demo 

Dadurch werden die Dateien in demo_files mit den Dateien in der Demo zusammengeführt. Es sollte nichts überschreiben.

Sie müssen * die Option -n verwenden, um anzugeben, dass vorhandene Dateien im Zielverzeichnis nicht überschrieben werden. vor 14 Jahren 1
0
Eric

dirA dir1 file1.txt file3.txt dirB dir1 file1.txt file2.txt

Ich würde es so machen:

$ cd dirA $ tar cf - | (cd .../dirB ; tar xf -) 

Dateien werden überschrieben, Verzeichnisse nicht.

0
Grunty

Die Erics-Lösung funktionierte, aber ich musste die Syntax ein wenig anpassen:

$ cd dirA $ tar -cf - ./* | (cd .../dirB ; tar -xf -)