Con GNU mv :
find path_A -name '*AAA*' -exec mv -t path_B {} +
Eso utilizará la -exec
opción de búsqueda que reemplaza {}
a cada resultado de búsqueda a su vez y ejecuta el comando que le das. Como se explica en 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.
En este caso, estamos utilizando la +
versión de -exec
para ejecutar la menor cantidad de mv
operaciones posible:
-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.
+
que hace el trabajo, puedes leer mi cita anterior o en suman find
lugar-exec mv {} path_b +
y estaba fallando con los errores de permisos. TBH, todavía no entiendo por qué, ¡pero-exec mv -t path_b {} +
funciona de maravilla!-exec ... {} +
, el{}
tiene que ser lo último antes del+
. Es por eso que usamv -t destdir {} +
y nomv {} destdir +
. En-exec mv {} destdir ';'
cambio, se utilizó un resfriado , pero eso se habría ejecutadomv
una vez para cada archivo.También podrías hacer algo como a continuación.
Dónde,
-0
Si hay espacios o caracteres en blanco (incluidas las nuevas líneas), muchos comandos no funcionarán. Esta opción se ocupa de los nombres de archivos con espacio en blanco.-I
Reemplace las ocurrencias de replace-str en los argumentos iniciales con nombres leídos de la entrada estándar. Además, los espacios en blanco sin comillas no terminan los elementos de entrada; en cambio, el separador es el carácter de nueva línea.Pruebas
Creé dos directorios como
sourcedir
ydestdir
. Ahora, creé un montón de archivos dentrosourcedir
comofile1.bak
,file2.bak
yfile3 with spaces.bak
Ahora, ejecuté el comando como,
Ahora, dentro de
destdir
, cuando lo hagols
, puedo ver que los archivos se han movido desourcedir
adestdir
.Referencias
http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/
fuente
Para beneficio de los usuarios de OS X que se encuentran con esta pregunta, la sintaxis en OS X es ligeramente diferente. Suponiendo que no desea buscar de forma recursiva en subdirectorios de
path_A
:Si desea buscar todos los archivos de forma recursiva en
path_A
:fuente
find
que haya usado. Puntos-maxdepth
positivos : (especialmente si path_B es un subdirectorio, ¡evitamv
intentar mover archivos que ya están allí!) Y usar \; (por lo que {} no tiene que ser el último parámetro ymv
se puede usar la sintaxis normal )La
-exec
es la mejor manera de hacer esto. Si, por alguna razón, esta no es una opción, también puede leer los resultados en un bucle:Esa es la forma segura, puede tratar con nombres de archivos que contienen espacios, líneas nuevas u otros caracteres extraños. Una forma más simple, pero que falla a menos que los nombres de sus archivos consistan solo en caracteres alfanuméricos simples , es
Pero usa el bucle while.
fuente
your file names consist only of simple alphanumeric characters
, por ejemplo, si llegaARG_MAX
Usando solo características POSIX de
find
(y también demv
):Otras lecturas:
fuente
De otra manera
fuente