Avec GNU mv :
find path_A -name '*AAA*' -exec mv -t path_B {} +
Cela utilisera l' -exec
option de recherche qui remplacera le résultat {}
de chaque recherche et exécutera la commande que vous lui donnerez. Comme expliqué dans 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.
Dans ce cas, nous utilisons la +
version de -exec
afin de pouvoir exécuter le moins d’ mv
opérations possible:
-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.
+
qui fait le travail, vous pouvez lire ma citation ci-dessus ouman find
plutôt-exec mv {} path_b +
et cela échouait avec des erreurs d'autorisations. TBH, je ne comprends toujours pas pourquoi, mais ça-exec mv -t path_b {} +
marche!-exec ... {} +
, le{}
doit être la dernière chose avant le+
. C'est pourquoi il utilisemv -t destdir {} +
et nonmv {} destdir +
. Un rhume a utilisé à la-exec mv {} destdir ';'
place, mais cela aurait été exécutémv
une fois pour chaque fichier.Vous pouvez aussi faire quelque chose comme ci-dessous.
Où,
-0
S'il y a des espaces vides ou des caractères (y compris les nouvelles lignes), de nombreuses commandes ne fonctionneront pas. Cette option prend en charge les noms de fichiers avec un espace vide.-I
Remplacez les occurrences de replace-str dans les arguments initiaux par des noms lus à partir de l'entrée standard. De plus, les espaces non cités ne terminent pas les éléments en entrée; au lieu de cela, le séparateur est le caractère de nouvelle ligne.Essai
J'ai créé deux répertoires en tant que
sourcedir
etdestdir
. Maintenant, j'ai créé un tas de fichiers à l'intérieur ensourcedir
tant quefile1.bak
,file2.bak
etfile3 with spaces.bak
Maintenant, j'ai exécuté la commande en tant que,
Maintenant, à l'intérieur du
destdir
, quand je le faisaisls
, je pouvais voir que les fichiers étaient passés desourcedir
àdestdir
.Références
http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/
la source
Pour aider les utilisateurs d’OS X à répondre à cette question, la syntaxe sous OS X est légèrement différente. En supposant que vous ne souhaitiez pas effectuer de recherche récursive dans les sous-répertoires de
path_A
:Si vous souhaitez rechercher tous les fichiers de manière récursive dans
path_A
:la source
find
que j'ai utilisées. Bons points:-maxdepth
(surtout si path_B est un sous-répertoire - évite d’mv
essayer de déplacer des fichiers déjà là!) Et d’utiliser \; (donc {} ne doit pas nécessairement être le dernier paramètre et lamv
syntaxe normale peut être utilisée)Le
-exec
est le meilleur moyen de le faire. Si, pour une raison quelconque, ce n'est pas une option, vous pouvez également lire les résultats dans une boucle:C'est le moyen le plus sûr, il peut traiter des noms de fichiers contenant des espaces, des lignes nouvelles ou d'autres caractères étranges. Une méthode plus simple, mais qui échoue à moins que vos noms de fichiers ne soient composés que de simples caractères alphanumériques , est la suivante:
Mais utilisez la boucle while.
la source
your file names consist only of simple alphanumeric characters
, par exemple, si vous atteignezARG_MAX
En utilisant uniquement les fonctionnalités POSIX de
find
(et demv
):Lectures complémentaires:
la source
Autrement
la source