Tengo una secuencia de comandos bash para implementar código de un entorno beta a un entorno de producción, pero actualmente tengo que agregar la lista de archivos a un archivo txt de forma manual y, a veces, me faltan algunos. Básicamente mi script de implementación cat / loops copiando los archivos. (exportaciones / importaciones db también, pero eso no es relevante ... jajaja)
De todos modos, me gustaría usar el find
comando para generar una lista de archivos modificados en los últimos 14 días. El problema es que necesito quitar la ruta ./
para que el script de implementación funcione.
Aquí hay un ejemplo del uso del comando find:
encontrar . -type f -mtime -14> deploy.txt
Aquí está la línea que gatos deploy.txt
en mi script de implementación:
for i in `cat deploy.txt`; do cp -i /home/user/beta/public_html/$i /home/user/public_html/$i; done
¿Alguna idea de cómo lograr esto usando scripts de bash?
¡Gracias!
--dry-run
modo y envíe eso a un archivo para su revisión?Respuestas:
Puede usar la
-printf
opción de línea de comando con%f
para imprimir solo el nombre del archivo sin ninguna información de directorioo puede usar sed para simplemente eliminar el ./
fuente
/.
.|
como delimitador.%f
eliminará todos los directorios, no solo./
. Esto interrumpirá su secuencia de comandos de implementación si alguno de los archivos devueltosfind
se encuentra en subdirectorios..
. Y quizás sea mejor usar un ancla de inicio de línea:s|^\./||
%P
lugar de%f
. Esto simplemente cortó la ruta dada en la línea de comando.El
./
debe ser inofensivo. La mayoría de los programas serán tratados/foo/bar
y/foo/./bar
como equivalentes. Me doy cuenta de que no se ve muy bien, pero en base a lo que has publicado, no veo ninguna razón por la que pueda fallar tu script.Si realmente quieres quitártelo,
sed
es probablemente la forma más limpia:Si está en un sistema con GNU find (por ejemplo, la mayoría de los sistemas Linux), puede hacerlo de una vez con
find -printf
:Las
%P
declaraciones de la ruta completa de cada archivo encontrado, menos la ruta especificada en la línea de comandos, hasta e incluyendo la primera barra. Esto preservará cualquier subdirectorio en su estructura de directorios.fuente
./
prefijo es en realidad una característica; sin él, la salida de la tubería a otros comandos no funcionará correctamente, por ejemplo, para los nombres de archivo que comienzan con un guión.¿Por qué necesitas quitarte el
./
? Es válido tener en un camino. Asi queestá bien!
Pero si desea quitar el nombre del directorio en find, puede usar el
%P
argumento para-printf
.man find (1) dice:
Un ejemplo
¡Cuidado con la primera línea vacía! Si quieres evitarlo usa
-mindepth 1
fuente
Bueno, tienes algunas opciones. Puede usar la
-printf
opción en buscar para imprimir solo el nombre del archivo, o puede usar una herramienta como sed para simplemente quitar el./
.fuente
La solución "find -printf" no funcionará en FreeBSD porque find no tiene esa opción. En este caso, AWK puede ayudar. Devuelve un apellido ($ NF), por lo que puede funcionar en cualquier profundidad.
PD: tomado del libro "Programación shell Linux y Unix" de D.Tansley
fuente
Una solución rápida, si entiendo correctamente la pregunta, es usar
cut
en la salida delfind
comando:Esto eliminará los primeros caracteres de cada línea del resultado (en su caso
./
). Probablemente no sea la mejor solución, pero funciona en su escenario.fuente
sed
es perfecto para este tipo de cosasfuente
No sé de qué tipo de nombres de archivo estamos hablando, pero cualquier cosa con espacios o líneas nuevas pone en riesgo la mayoría de las soluciones.
Mi sugerencia sería usar la expansión de parámetros de shell para eliminar los caracteres de cada nombre de archivo:
Si realmente te gustan las tuberías, puedes usar un delimitador "seguro", como un nulo, con xargs para recibir cada nombre de archivo:
Recuerde que el resultado de esto NO está delimitado por un valor nulo, por lo que si bien puede ser suficiente para una comprobación del globo ocular, ninguna de estas soluciones produce un archivo deploy.txt que sea seguro de usar para la automatización, a menos que esté muy seguro de su fuente nombres de archivo
fuente