Mit GNU MV :
find path_A -name '*AAA*' -exec mv -t path_B {} +
Damit wird die -exec
Option find verwendet, die die Option {}
find nacheinander durch jedes Suchergebnis ersetzt und den von Ihnen angegebenen Befehl ausführt. Wie erklärt in man find
:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered.
In diesem Fall verwenden wir die +
Version von -exec
, um so wenig mv
Operationen wie möglich auszuführen :
-exec command {} +
This variant of the -exec action runs the specified command on
the selected files, but the command line is built by appending
each selected file name at the end; the total number of invoca‐
tions of the command will be much less than the number of
matched files. The command line is built in much the same way
that xargs builds its command lines. Only one instance of `{}'
is allowed within the command. The command is executed in the
starting directory.
+
das, was den Job schmälert, Sie können mein Zitat oben oderman find
stattdessen lesen-exec mv {} path_b +
und es schlug mit Berechtigungsfehlern fehl. TBH, ich verstehe immer noch nicht warum, aber es-exec mv -t path_b {} +
ist ein Vergnügen!-exec ... {} +
, der{}
hat das letzte , was vor dem sein+
. Deshalb benutzt ermv -t destdir {} +
und nichtmv {} destdir +
.-exec mv {} destdir ';'
Stattdessen wurde eine Erkältung verwendet , die jedochmv
für jede Datei einmal ausgeführt wurde .Sie könnten auch so etwas tun.
Wo,
-0
Wenn Leerzeichen oder Zeichen (einschließlich Zeilenumbrüche) vorhanden sind, funktionieren viele Befehle nicht. Diese Option berücksichtigt Dateinamen mit Leerzeichen.-I
Ersetzen Sie das Vorkommen von replace-str in den Anfangsargumenten durch Namen, die aus der Standardeingabe gelesen wurden. Außerdem werden Eingabeelemente nicht durch Leerzeichen in Anführungszeichen beendet. Stattdessen ist das Trennzeichen das Zeilenumbruchzeichen.Testen
Ich habe zwei Verzeichnisse als
sourcedir
und angelegtdestdir
. Jetzt habe ich eine Reihe von Dateien insourcedir
asfile1.bak
,file2.bak
and erstelltfile3 with spaces.bak
Nun habe ich den Befehl wie folgt ausgeführt:
Nun, innerhalb dem
destdir
, wenn ich das tuels
, ich konnte sehen , dass die Dateien von verschoben habensourcedir
zudestdir
.Verweise
http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/
quelle
Zum Nutzen von OS X-Benutzern, die auf diese Frage stoßen, unterscheidet sich die Syntax in OS X geringfügig. Angenommen, Sie möchten nicht rekursiv in folgenden Unterverzeichnissen suchen
path_A
:Wenn Sie alle Dateien rekursiv durchsuchen möchten, gehen Sie wie folgt vor
path_A
:quelle
find
ich verwendet habe. Gute Punkte:-maxdepth
(besonders wenn path_B ein Unterverzeichnis ist - vermeidetmv
es, Dateien zu verschieben, die bereits dort sind!) Und benutze \; (also muss {} nicht der letzte Parameter sein und esmv
kann die normale Syntax verwendet werden)Das
-exec
ist der beste Weg, dies zu tun. Wenn dies aus irgendeinem Grund nicht möglich ist, können Sie die Ergebnisse auch in einer Schleife lesen:Das ist der sichere Weg, es kann mit Dateinamen umgehen, die Leerzeichen, Zeilenumbrüche oder andere seltsame Zeichen enthalten. Ein einfacherer Weg, der jedoch fehlschlägt, wenn Ihre Dateinamen nicht nur aus einfachen alphanumerischen Zeichen bestehen , ist
Aber benutze die while-Schleife.
quelle
your file names consist only of simple alphanumeric characters
zBARG_MAX
Verwendung nur der POSIX-Funktionen von
find
(und auch vonmv
):Weitere Lektüre:
quelle
Ein anderer Weg
quelle