Tengo una gran cantidad de archivos de registro, la idea es agruparlos por fecha / mes y luego empaquetarlos en archivos.
Aquí está mi guión:
find /c/this/path/ -type f -name "$file_pattern" | xargs -I fn basename fn | cut -c$start-$end | uniq | xargs -I {} sh -c "tar zcvf {}-$postfix.tgz {}$file_pattern"
Todas las variables están definidas. Sin embargo, cuando ejecuto esto (llamar a una función que contiene este script), el archivo no se crea y no se muestran errores. Cuando ejecuto esto manualmente, con parámetros codificados, funciona bien. Supongo que me equivoqué con la sustitución de parámetros.
Por cierto, ejecuto esto en Windows usando comandos que vienen con la instalación de msysgit (si esto hace alguna diferencia).
echo
antessh -c
para ver qué sucede.Respuestas:
Si entiendo su pregunta, desea saber cómo pasar argumentos al script especificado por
-c
El primer argumento después del guión (
_
) se convertirá$0
ensh
, y el siguiente argumento ({}
de xargs) será$1
. La combinación de comillas simples y dobles es un poco desordenada, pero es necesaria ya que tiene algunos parámetros que necesita sustituir ahora y algunos que necesitash
manejar.fuente
Debe llamar a sus variables de esta manera en
${variable}
lugar de$variable
que también sea convencional escribirlo en mayúsculas de esta manera${VARIABLE}
fuente
Me parece que entiendo el problema. El guión en sí está bien. file_pattern se define como:
file_pattern=*.log
Sin embargo, en el directorio actual tenía un archivo que coincide con ese comodín (por ejemplo, something.log), y la variable file_pattern se rellenó con el nombre de ese archivo. Después de envolver la evaluación file_pattern entre comillas dobles, todo estuvo bien. Puede ser que alguien me diga por qué tal expansión?EDITAR Escapé del asterisco así:
file_pattern=\*.log
y el script funciona bien ahorafuente