varios todos por otro mover los fecha ejemplos directorio copiar contenido comandos comando basicos archivos archivo shell find xargs mv

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.