shell - por - mover todos los archivos de un directorio a otro en linux
Utilice xargs para mv un directorio de buscar resultados en otro directorio (5)
Tengo el siguiente comando:
find . -type d -mtime 0 -exec mv {} /path/to/target-dir /;
Esto moverá el directorio fundado a otro directorio. ¿Cómo puedo usar xargs
lugar de exec
para hacer lo mismo?
Con BSD xargs (para OS X y FreeBSD), puede usar -J
que fue creado para esto:
find . -name some_pattern -print0 | xargs -0 -J % mv % target_location
Eso movería cualquier cosa que coincida con some_pattern
.
para target_location
Con GNU xargs (para Linux y Cygwin), use -I
lugar:
find . -name some_pattern -print0 | xargs -0 -I % mv % target_location
La opción obsoleta -i
de GNU xargs implica -I{}
y se puede usar de la siguiente manera:
find . -name some_pattern -print0 | xargs -0 -i mv {} target_location
Tenga en cuenta que BSD xargs también tiene una opción -I
, pero eso hace algo más.
Si no está utilizando GNU mv, puede usar ese comando:
find . -depth -type d -mtime 0 -exec bash -c ''declare -a array;j=1;for i; do array[$j]="$i"; j=$((j+1));done; mv "${array[*]}" /path/to/target-dir'' arg0 {} +
de lo contrario, aquí hay una solución más simple que no requiere xargs:
find . -depth -type d -mtime 0 -exec mv -t /path/to/target-dir {} +
Tenga en cuenta que agregué -depth; de lo contrario, tendrá errores cuando se va a procesar un directorio y uno de sus subdirectorios.
Si tiene GNU mv
(y find
y xargs
), puede usar la opción -t
para mv
(y -print0
para find
y -0
para xargs
):
find . -type d -mtime -0 -print0 | xargs -0 mv -t /path/to/target-dir
Tenga en cuenta que las versiones modernas de find
(compatibles con POSIX 2008) admiten +
en lugar de ;
y se comportan más o menos de la misma manera que xargs
sin usar xargs
:
find . -type d -mtime -0 -exec mv -t /path/to/target-dir {} +
Esto hace que find
grupos de números convenientes de nombres de archivos (directorio) en una sola invocación del programa. No tiene el nivel de control sobre los números de argumentos pasados a mv
que proporciona xargs
, pero rara vez lo necesita de todos modos. Esto todavía depende de la opción -t
para GNU mv
.
find
no es realmente una buena herramienta para esto. Me imagino que quieres mover todos los subdirectorios a otro directorio. find
dará salida a cosas como
./a
./a/b
./a/b/c
./a/b/c/d
Después de que ./a
se mueva primero, obtendrá errores acerca de ''no dicho archivo o directorio'' todos los subdirectores.
Solo debe usar mv */ /another/place
- la barra inclinada del comodín restringe la expansión solo a los directorios.
find ./ -maxdepth 1 -name "some-dir" -type d -print0 | xargs -0r mv -t x/
buscar : con la opción -print0
, la salida terminará con ''/ 0'';
xargs : con la opción -0
, dividirá args por ''/ 0'' pero el espacio en blanco, -r
significa no-run-if-empty, por lo que no obtendrá ningún error si el resultado no obtuvo ningún resultado. (El -r
es una extensión de GNU).
Usualmente uso esto en scripts cuando no estoy seguro de si los archivos de destino existen o no.