Dateien suchen und kopieren

128

Warum werden die Dateien im Folgenden nicht in den Zielordner kopiert?

# find /home/shantanu/processed/ -name '*2011*.xml' -exec cp /home/shantanu/tosend {} \;

cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
Shantanuo
quelle

Antworten:

273

Wenn Sie beabsichtigen, die gefundenen Dateien nach / home / shantanu / tosend zu kopieren, haben Sie die Reihenfolge der Argumente in cp umgekehrt:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp "{}" /home/shantanu/tosend  \;

Hinweis: Der Befehl find verwendet {} als Platzhalter für eine übereinstimmende Datei

malcolmpdx
quelle
14
Was ist der Zweck von \;?
Astrid
5
@ Strid überprüfen Sie dies
Shellbye
find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;Stimmt etwas mit diesem Befehl nicht? es funktioniert nicht
mrid
2
Funktioniert nicht, wenn die Ergebnisse ein Leerzeichen im Pfad enthalten. Irgendwelche Vorschläge dazu?
TheJeff
1
In Ubuntu 18 müssen die geschweiften Klammern auch in einfache Anführungszeichen gesetzt werden: find -iname '* .mp3' -mtime -1 -exec cp '{}' / home / my_path / \;
p6majo
32

Ich stand vor einem Problem wie diesem ...

Tatsächlich können Sie die findBefehlsausgabe auf zwei Arten im copyBefehl verarbeiten

  1. Wenn find die Ausgabe des Befehls kein Leerzeichen enthält, dh wenn der Dateiname kein Leerzeichen enthält, können Sie den folgenden Befehl verwenden:

    Syntax: find <Path> <Conditions> | xargs cp -t <copy file path>

    Beispiel: find -mtime -1 -type f | xargs cp -t inner/

  2. In den meisten Fällen enthalten unsere Produktionsdatendateien jedoch Speicherplatz. Die meiste Zeit unter dem genannten Befehl ist also sicherer:

    Syntax: find <path> <condition> -exec cp '{}' <copy path> \;

    Beispiel find -mtime -1 -type f -exec cp '{}' inner/ \;

Im zweiten Beispiel wird der letzte Teil, dh das Semikolon, ebenfalls als Teil des findBefehls betrachtet, der vor dem Drücken der Eingabetaste maskiert werden sollte. Andernfalls wird eine Fehlermeldung angezeigt

find: missing argument to `-exec'

In Ihrem Fall ist die Syntax des Kopierbefehls falsch, um die Suchdatei zu kopieren /home/shantanu/tosend. Der folgende Befehl funktioniert:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;
Thiyagu ATR
quelle
3. Wenn Sie GNU find/ xargs, find <Path> <Conditions> -print0 | xargs -0 -r cp -t <copy file path>. Beispiel:find -mtime -1 -type f -print0 | xargs -r0 cp -t inner/
Toby Speight
7

Sie müssen verwenden, cp -t /home/shantanu/tosendum zu erkennen, dass das Argument das Zielverzeichnis und keine Quelle ist. Sie können es dann in ändern -exec ... +, um cpso viele Dateien wie möglich gleichzeitig zu kopieren.

Ignacio Vazquez-Abrams
quelle
2
Unter Linux musste das Zielverzeichnis wie find /home/shantanu/processed/ -name '*2011*.xml' -exec cp --target-directory=/home/shantanu/tosend {} \;
folgt angegeben werden
3
Diese Antwort könnte verbessert und verkürzt werden, wenn der vollständige Befehl wie in der oberen Antwort angegeben würde.
Brian
-1
for i in $(ls); do cp -r "$i" "$i"_dev; done;
Robert A.
quelle
-2

Der Grund für diesen Fehler ist, dass Sie versuchen, einen Ordner zu kopieren, für den die Option -r erforderlich ist, um auch cp zu verwenden. Danke

Sebin John
quelle
3
Hallo, da die Frage bereits beantwortet wurde (seit einiger Zeit), ist dies keine wirklich relevante Antwort. Es sollte auch ein Kommentar sein (wenn Sie mehr Wiederholungen haben), es sei denn, Sie möchten sie erweitern und erklären. Nur ein Kopf hoch :).
W1ll1amvl