cp nur Dateien, Verzeichnisse überspringen

cp nur Dateien, Verzeichnisse überspringen

Die Verwendung von cp zum Kopieren von Dateien aus einem Verzeichnis, das auch ein leeres Verzeichnis enthält, führt zu einem Fehlerrückgabewert, wodurch mein Skript fehlschlägt.

Gibt es eine Möglichkeit, die Verzeichnisse einfach zu überspringen, ohne dass ein Fehler zurückgegeben wird? Ich möchte, dass der Fehlerwert alle Fehler widerspiegelt, aber ein leeres Verzeichnis darin sollte einfach übersprungen werden, ohne als Fehler gemeldet zu werden.

Ich könnte einfach ein rekursives Flag hinzufügen -r, aber was ist, wenn ich nicht möchte, dass das Verzeichnis kopiert wird, aber ichTunmöchten Sie, dass Fehler gemeldet werden?

Antwort1

Ich schlage vor, dass Sie rsync statt cp verwenden. Es hat, wenn möglich, die Option -m, die leere Ordner ausschließt, Beispiel:

rsync -am <origin> <destination>

Erläuterung des Befehls inerklärthell.com

Ich verwende die Option -a, da sie viele nette Standardaktionen ausführt, Sie können aber auch die Option -r verwenden, die nur den rekursiven Modus einstellt.

[Einen Kommentar hinzufügen]

Ich kenne keine Möglichkeit, dies mit cp zu tun, zumindest zeigt die Manpage keine Option, die das für Sie erledigt. Sie können wahrscheinlich eine komplexere Lösung finden, indem Sie den Befehl verwenden, findum eine Liste der zu kopierenden Dateien/Verzeichnisse zu finden und diese dann an cp zu übergeben, aber das wäre viel komplizierter als rsync. rsync ist in vielen Linux-Versionen sogar so ziemlich Standard

Antwort2

cphat zwar keine Option, nur Dateien abzurufen, aber alsberserckgesagt, Sie können findzusammen mit verwenden cp. Tatsächlich ist das ganz unkompliziert:

# Copy only files
find /path/to/file -type f -execdir cp "{}" /dest/path ";"

Oder:

# Copy everything except directories
find /path/to/file -not -type d -execdir cp "{}" /dest/path ";"

Erläuterung

findist das Tool, das nach den gewünschten Dateien sucht. Bei der ersten Option legen wir fest, -type fdass nur normale Dateien zurückgegeben werden. Bei der zweiten Option legen wir fest, -not -type ddass alles außer Verzeichnissen abgerufen wird. findführt die an übergebenen Argumente aus und -execdirersetzt sie {}durch jeweils einen Ergebniseintrag und stoppt den Befehl, wenn ;gefunden wird ( sollte maskiert oder ;werden , oder die Shell könnte es erweitern).\;";"

-execdirführt den Befehl mit dem Ordner der Datei als „Arbeitsverzeichnis“ aus und ist anstelle von vorzuziehen -exec, siehe unten.

Die -typeOptionsdokumentation:

-Typ c

Die Datei ist vom Typ C:

b: Block (gepuffert) Spezial

c: Zeichen (ungepuffert) Spezial

d: Verzeichnis

p: benannte Pipe (FIFO)

f: normale Datei

l: symbolischer Link; dies ist nie der Fall, wenn die Option -L oder -follow aktiv ist, es sei denn, der symbolische Link ist defekt. Wenn Sie nach symbolischen Links suchen möchten, während -L aktiv ist, verwenden Sie -xtype.

s: Buchse

D: Tür (Solaris)

Die -notOptionsdokumentation:

!Ausdruck

Wahr, wenn expr falsch ist. Dieses Zeichen muss normalerweise auch vor der Interpretation durch die Shell geschützt werden.

-nichtAusdruck

Dasselbe wie ! expr, aber nicht POSIX-kompatibel.

Die -execdirOptionsdokumentation:

-execBefehl ;

AusführenBefehl;true, wenn der Status 0 zurückgegeben wird. Alle folgenden Argumente von find werden als Argumente des Befehls betrachtet, bis ein Argument bestehend aus ';' gefunden wird. Die Zeichenfolge '{}' wird überall, wo sie in den Argumenten des Befehls vorkommt, durch den aktuellen Dateinamen ersetzt, der verarbeitet wird [...]. Beide dieser Konstruktionen müssen möglicherweise maskiert (mit einem '\') oder in Anführungszeichen gesetzt werden, um sie vor der Erweiterung durch die Shell zu schützen. Der angegebene Befehl wird einmal für jede übereinstimmende Datei ausgeführt. Der Befehl wird im Startverzeichnis ausgeführt.Im Zusammenhang mit der Verwendung der Aktion -exec gibt es unvermeidbare Sicherheitsprobleme. Sie sollten stattdessen die Option -execdir verwenden.

-execdirBefehl ;

Wie -exec, aber der angegebeneDer Befehl wird aus dem Unterverzeichnis ausgeführt, das die übereinstimmende Datei enthält, was normalerweise nicht das Verzeichnis ist, in dem Sie find gestartet haben. Dies ist eine viel sicherere Methode zum Aufrufen von Befehlen, da sie Race Conditions während der Auflösung der Pfade zu den übereinstimmenden Dateien vermeidet. [...] Wenn Sie diese Option verwenden, müssen Sie sicherstellen, dass Ihre Umgebungsvariable $PATH nicht auf '.' verweist. Andernfalls kann ein Angreifer beliebige Befehle ausführen, indem er eine entsprechend benannte Datei in einem Verzeichnis hinterlässt, in dem Sie -execdir ausführen. Dasselbe gilt für Einträge in $PATH, die leer sind oder keine absoluten Verzeichnisnamen sind.

https://linux.die.net/man/1/find

verwandte Informationen