Ich möchte einige Dateien finden und sie dann verschieben.
Ich kann die Datei finden mit:
$ find /tmp/ -ctime -1 -name x*
Ich habe versucht, sie in mein ~/play
Verzeichnis zu verschieben:
$ find /tmp/ -ctime -1 -name x* | xargs mv ~/play/
aber das hat nicht funktioniert. Offensichtlich braucht mv zwei Argumente.
Sie sind sich nicht sicher, ob (oder wie) Sie auf das 'aktuelle Element' von xargs im Befehl mv verweisen sollen?
-I
: verwendenfind . | xargs -I'{}' mv '{}' ~/play/
, aber wie der Mensch sagt, bedeutet das "-x
und-L 1
". Also kein Gewinn. Besser einfach halten und verwendenfind . -exec mv '{}' ~/play/ \;
Antworten:
Schauen Sie sich Stephanes Antwort für die beste Methode an und meine Antwort aus Gründen, die naheliegenderen Lösungen nicht zu verwenden (und aus Gründen, warum sie nicht die effizientesten sind).
Sie können folgende
-I
Optionen verwendenxargs
:Welches funktioniert in einem ähnlichen Mechanismus wie
find
und{}
. Ich würde auch Ihr-name
Argument zitieren (weil eine Datei, die mitx
im vorliegenden Verzeichnis beginnt, dateiglobiert und als zu suchendes Argument übergeben würde - was nicht das erwartete Verhalten ergibt!).Wie jedoch durch manatwork ausgeführt, wie in der
xargs
Manpage beschrieben:Die wichtige Sache zu beachten ist , dass
-L 1
Mittel , die nur eine Zeile der Ausgabe vonfind
zu einem Zeitpunkt bearbeitet werden. Das heißt, das ist syntaktisch dasselbe wie:(der eine einzelne
mv
Operation für jede Datei ausführt ).Sogar die Verwendung des GNU-
-0
Arguments xargs und desfind -print0
Arguments verursacht genau dasselbe Verhalten von-I
- dies istclone()
ein Prozess für jede Dateimv
:quelle
Mit GNU-Tools:
Die
-t
(--target
) Option ist GNU-spezifisch.-print0
,-r
,-0
, Während Nicht-Standard , mit Ursprung in GNU ist auch in einigen anderen Implementierungen wie auf einigem BSDs gefunden.POSIXly:
Beide führen so wenige
mv
Befehle wie nötig aus und funktionieren mit allen Zeichen, die der Dateiname enthalten kann. Die GNU one hat möglicherweise den Vorteil, dass siefind
ständig nach Dateien sucht, währendmv
sie den ersten Stapel verschiebt.Beachten Sie, dass alle Dateien und Verzeichnisse in einem Verzeichnis landen. Achten Sie auf Konflikte, wenn mehrere Dateien in verschiedenen Verzeichnissen denselben Namen haben.
quelle
mv
alle Argumente (oder alle-L
oder-n
, falls angegeben) einmal abgefragt werden. Andernfalls wird das Aufrufenmv
jeder Datei schnell alt (und langsam).Vielleicht ist dieser Befehl jetzt möglich und war 2013 noch nicht verfügbar, aber das funktioniert perfekt für mich:
Die
-t
Taste setzt den Zielordner an die erste Stelle und gibt denmv
Befehl frei, um alle letzten Argumente als nur die zu verschiebenden Dateien zu haben.quelle
Sie können mit dem folgenden Befehl versuchen und getestet und es hat gut funktioniert
quelle