mover directorios después de grep

mover directorios después de grep

Emití el siguiente comando para mover algunos directorios a la carpeta "build_tools", sin embargo, el resultado no fue el que esperaba.

ls -l | grep 2014-03 | awk '{if ($8!=build_tools) print $8}' | xargs mkdir build_tools/{} && mv {}/ build_tools/{}/

Movió la carpeta "build_tools" a una de las carpetas generadas por awk (zlib) junto con el resto de directorios y luego se quedó atascado con este mensaje:

mkdir: no se puede crear el directorio «zlib»: El archivo ya existe

¿Alguien puede arrojar algo de luz sobre cuál es mi error?

EDITAR 1:

La salida de ls -l me da:

drwxr-xr-x  3 poissonbreaker poissonbreaker     4096 2011-05-02 09:58 antlr3.2
-rw-r--r--  1 poissonbreaker poissonbreaker   318588 2011-05-17 16:21 AppFramework-1.03.jar
-rw-r--r--  1 poissonbreaker poissonbreaker        0 2014-03-04 09:53 awk
drwxr-xr-x  4 poissonbreaker poissonbreaker     4096 2013-01-11 23:13 clutter-sharp
-rw-r--r--  1 poissonbreaker poissonbreaker      429 2014-01-14 09:49 Dependencias

Solo quiero obtener los archivos con el campo de fecha ($6) que coincida con 2014-03, es por eso que hago un grep simple como (Ningún archivo en el directorio tiene como nombre de archivo este patrón):

ls -l  | grep 2014-03 

Cuyos rendimientos:

-rw-r--r--  1 poissonbreaker poissonbreaker        0 2014-03-04 09:53 awk
-rw-r--r--  1 poissonbreaker poissonbreaker      429 2014-01-14 09:49 Dependencias

Luego obtengo el campo de nombre de archivo ($8) de cada archivo a través de awk para finalmente moverlo a la carpeta build_tools (en este punto sé cuál fue mi error: la carpeta build_tools también se creó en esta fecha: S). Sin embargo, dejaré esta pregunta aquí, en caso de que algunas partes sean útiles para alguien.

EDITAR 2: He cambiado la expresión awk a:

awk '{if ($8!=build_tools) print $8}'

para que tenga sentido.

Respuesta1

Supongo que tienes GNU find. Si desea mover archivos o directorios modificados dentro de un período de tiempo determinado (por ejemplo, marzo de 2014), haga esto:

find . -maxdepth 1 \
-newermt 2014-02-28 -not -newermt 2014-04-01 \
-not -name 'build_tools' \
-exec mv {} build_tools \+

Explicación:

  • buscar en este directorio, sin subdirectorios
  • archivos en el rango entre el 28 de febrero y el 1 de abril, donde mtse refiere al tiempo de modificación. También puedes utilizar ctpara buscar el tiempo de creación.
  • que no tienen nombrebuild_tools
  • moverlos todos a build_tools. Esto \+significa que todos los nombres de archivos/directorios encontrados se reemplazan en {}, en lugar de uno a la vez. Si quieres uno a la vez, lo necesitas \;.

Un par de cosas:

  • No analices la salida dels. El formato depende del sistema operativo y la selección de columnas awkfalla si los nombres de archivos/directorios contienen espacios en blanco.

  • Solías &concatenar comandos, pero &simplemente pones un proceso en segundo plano. En todo caso, deberías haber usado &&, pero en general, sería bastante complicado lograr lo que deseas.

Respuesta2

La versión correcta para mi solución necesita xargs para manejar múltiples comandos, lo que se puede lograr envolviendo los comandos con:

sh -c (or bash -c) 'Command1; Command2; .. Comandn'

Entonces la solución correcta es:

ls -l awk ' $8!=build_tools && $6 ~ /2013-03*/ {print $8}' | xargs -I @ sh -c 'mkdir build_tools/@; mv @ build_tools/@'

Tenga en cuenta que esto crea una nueva carpeta para cada archivo a mover.

La conclusión es que, si bien otros se han encargado de hacernos la vida más fácil con herramientas mejores y especializadas, todavía podemos aprender mucho de las consultas canalizadas de estilo antiguo. Al menos en mi caso :)

información relacionada