Wie teste ich, welche Dateien mit dem Befehl cp kopiert werden?

11

Ich erstelle ein einfaches Skript, das alle Dateien aus DIRECTORYA kopiert, die in DIRECTORYB nicht vorhanden sind. Ich mache das mit dem Befehl cp:

cp -u DIRECTORYA/* DIRECTORYB

Ich möchte auch eine E-Mail an einen Administrator senden, in der die kopierten Dateien aufgelistet sind.

Bevor ich den obigen Befehl ausführe, möchte ich im Idealfall die zu kopierenden Dateien abrufen und in einer Variablen speichern, um sie später beim Erstellen meiner E-Mail-Nachricht zu verwenden.

Kann mich jemand in die richtige Richtung weisen? Ich habe versucht, grep zu verwenden, aber ich glaube nicht, dass dies mit dem Befehl cp möglich ist.

James
quelle
1
Vielleicht verstehe ich Ihre Frage falsch, aber können Sie die -vFlagge nicht verwenden , um die Dateinamen beim Kopieren auszudrucken? Leiten Sie das in eine Datei oder direkt in eine Variable um und erstellen Sie damit Ihre Nachricht.
ThibautRenaux
Zusätzlich hat der cpBefehl die Option --attributes-only, keine Dateidaten zu kopieren, sondern nur Verzeichnis- und Dateistruktur.
Costas
Entschuldigung, ich bin ziemlich neu in der Skripterstellung. Wie kann ich bei Verwendung des Flags -v eine Variable anstelle einer Datei ausgeben?
James
1
Angenommen, Sie verwenden bash, variable=$(cp -v ...)erfasst die Standardausgabe von cp. Siehe gnu.org/software/bash/manual/html_node/Command-Substitution.htm
Gowtham

Antworten:

4

Ich glaube nicht, dass GNU cpIhnen helfen kann, wenn Sie sehen möchten, was es ohne Handeln tun würde. Wenn Sie die geänderten Dateien protokollieren möchten, können Sie die folgende -vOption verwenden:

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

Stattdessen cpkönnen Sie rsync verwenden , das viel leistungsfähiger ist und fast überall installiert wird, außer bei eingebetteten Low-End-Systemen (und einfach zu installieren, wenn es standardmäßig nicht vorhanden ist).

rsync -aun DIRECTORYA/* DIRECTORYB >what-would-be-done.txt

oder

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log
Gilles 'SO - hör auf böse zu sein'
quelle
2

Wenn Sie laufen wollten cp foo*bar whatever, dann laufen Sie echo foo*bar whateverstattdessen.

VaTo
quelle
Aber OP will rennen cp -uund sucht nach einer Trockenlauf-ähnlichen Option für cp.
Arkadiusz Drabczyk
2

Laut der Handbuchseite ,

-u, Kopieren nur , wenn die SOURCE - Datei ist neuer als die Zieldatei oder wenn die Zieldatei fehlt--update

Dies ist eine Funktion, die zwei Tests kombiniert, einen trivialen, der in einem Skript implementiert werden soll ( fehlt ) und einen, der einige Arbeit erfordert ( neuer ). Sie können ein Skript erstellen, das mit und meldet, was benötigt commwird .difftest

Keines der Standarddienstprogramme cpbietet die Möglichkeit, einen Kopiervorgang trocken auszuführen. Wie vorgeschlagen, rsyncist dies der Weg, dies mit einem allgemein verfügbaren Dienstprogramm zu tun. Natürlich rsyncwird normalerweise zum Kopieren nach mehr Kriterien als nur neueren oder fehlenden Kriterien verwendet (Dateigröße und Zeitstempel werden ebenfalls verwendet). Aber es kann auf gerechtes Handeln reduziert werden cp -u.

Für nicht standardmäßige Dienstprogramme gibt es das copyDienstprogramm, das ich Ende der 1980er Jahre geschrieben habe (und natürlich immer noch verwende). Es wurde wahrscheinlich vom makeDienstprogramm inspiriert , da die erste Option, die ich hinzufügte, war -n.

Für das gegebene Beispiel würde es wie folgt verwendet:

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes

Weiterführende Literatur:

  • Dienstprogramm zum Kopieren von Dateien / Verzeichnissen

    -n Deaktiviert die eigentliche Erstellung oder Änderung von Dateien und zeigt (abhängig von der Ausführlichkeit) den Effekt an, den der copy Befehl haben würde.
    -u kopiert Dateien nur, wenn ihre Größe oder ihr Änderungsdatum unterschiedlich sind, und Links nur, wenn der Linktext unterschiedlich ist.
    -U kopiert nur Dateien, die neuer als das Ziel sind oder die im Ziel nicht vorhanden sind.

  • Änderungsprotokolleintrag vom August 1988 :

    1988-08-16    
            * src / copy / src / copy.c: Optionen "-d" und "-n" hinzugefügt.
    
Thomas Dickey
quelle
0

Sie können den Befehl diff verwenden. Ich habe einen Job, der jeden Tag einige Sicherungsdateien kopiert. Einige Zeit muss ich überprüfen, ob alle Dateien kopiert wurden, hier ist die Syntax:

diff /file1/ /file2/

und natürlich, wenn Sie sie kopieren möchten, verwenden Sie:

cp -u /file1/* /file2
Poori
quelle
0

Verwenden Sie stattdessen rsync. Rsync funktioniert perfekt auf lokalen Kopien und kann mit Sicherheit tun, was Sie wollen, sobald Sie die fünfzehn Millionen Optionen durchlaufen haben.

rsync -avun DIRECTORYA/ DIRECTORYB

zeigt Ihnen alles, was getan werden würde, und

rsync -avu DIRECTORYA/ DIRECTORYB

werde es tun.

Edward Falk
quelle