it-swarm.com.de

Kopieren Sie Dateien von einem Ordner in einen anderen Ordner innerhalb eines bestimmten Datumsbereichs

Ich benutze bereits den folgenden Befehl, um Dateien von einem bestimmten Datum zu kopieren.

Früher habe ich diesen Befehl verwendet und er hat gut funktioniert, jetzt wurde jedoch ein Fehler angezeigt:

-bash: /bin/cp: Argument list too long

Verwendete Commends:

cd /share/new/
cp `find . -type f -newermt '16 july 2018'` /share/test

Ich muss vom 20. Juli bis zum heutigen Datum alle Dateien in den Ordner "new" kopieren. Wie kann ich das erreichen?

4
Venki

Verwenden Sie cp nicht direkt mit der Ausgabe von find.

Möglicherweise werden in einem Schritt viel zu viele Dateien übergeben (und aus diesem Grund wird der Fehler Argument list too long angezeigt).

Verwenden Sie den -exec -Parameter von find, der den angegebenen Befehl ausführt und jede übereinstimmende Datei einzeln an cp übergibt:

cd /share/new/
find . -type f -newermt '16 july 2018' -exec cp {} /share/test \;
9
Mr Shunz

benutze find -exec:

find /share/new/ -type f -newermt '16 july 2018' -exec cp {} /share/test \;
3
pLumo

Verwenden Sie die Aktion -exec von find und die Option -t von cp; Ich empfehle auch die Optionen -i oder -n, wenn Sie nicht versehentlich Dateien mit identischen Namen überschreiben möchten:

find ... -exec cp -i -t TARGET -- {} +

Die anderen aktuellen Antworten erzeugen einen cp untergeordneten Prozess für jede übereinstimmende Datei, während diese Antwort nur so viele wie nötig erzeugt, basierend auf der maximalen Länge der Programmargumente (siehe unten) Tausend Streichhölzer, wie es scheint.


Aus dem find(1) Handbuch:

  • -exec command ; - Befehl ausführen […]. Alle folgenden zu suchenden Argumente gelten als Argumente für den Befehl, bis ein Argument gefunden wird, das aus ; besteht. Die Zeichenfolge {} wird durch den aktuellen Dateinamen ersetzt, der überall dort verarbeitet wird, wo er in den Argumenten des Befehls […] vorkommt. Der angegebene Befehl wird für jede übereinstimmende Datei einmal ausgeführt. […]

  • -exec command {} + - Diese Variante der Aktion -exec führt den angegebenen Befehl für die ausgewählten Dateien aus, die Befehlszeile wird jedoch erstellt, indem jeder ausgewählte Dateiname am Ende angehängt wird. Die Gesamtzahl der Aufrufe des Befehls ist viel geringer als die Anzahl der übereinstimmenden Dateien. […]

Aus dem cp(1) Handbuch:

  • -t, --target-directory=DIRECTORY - kopiert alle SOURCE-Argumente in DIRECTORY
  • -i, --interactive - Eingabeaufforderung vor dem Überschreiben
  • -n, --no-clobber - überschreibt keine vorhandene Datei
0
David Foerster