¿Qué hace "grep -v "^.$""?

¿Qué hace "grep -v "^.$""?

Tengo un script para limpiar archivos de datos.

El comando:

for i in `find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$" |grep data-`

Intenté ejecutar el comando sin la grep -vfunción y no veo ninguna diferencia.

Me gustaría saber qué grep -v "^.$"hace. No creé este script y no puedo encontrar nada en línea.

Respuesta1

grep -v "^.$"imprimirá todas las líneas de entrada excepto aquellas que tengan un solo carácter.

Como se utiliza en:

find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$"

Podemos suponer que se trata de descartar el directorio de trabajo actual ( .) de findla salida de (que se muestra cuando .se usa la ruta relativa), lo que se puede lograr fácilmente mediante -mindepth 1una opción, aunque aquí es redundante ya que se usa la ruta absoluta en find.

Luego solo buscará archivos con data-sus nombres por grep data-, esto también es redundante. Puedes poner toda la lógica en una sola findinvocación:

find /ddomain/data/shop12/ -name '*data-*' -mtime +15 -print

Soltar -printtambién, es la acción por defecto:

find /ddomain/data/shop12/ -name '*data-*' -mtime +15

Solo para tener en cuenta que si solo busca archivos, agregue -type ftambién:

find /ddomain/data/shop12/ -type f -name '*data-*' -mtime +15

Respuesta2

Como ya han dicho otros, grep -v '^.$'filtra las líneas que constan exactamente de un carácter (líneas que constan del comienzo de la línea ( ^) seguido de un carácter ( .) seguido del final de la línea ( $). Otra forma de escribirlo sería grep -vx .donde -xhace el ^y $implícito (las .coincidencias en toda la línea).

Sobre la salida de:

find /ddomain/data/shop12/ -mtime +15 -print

Eso tiene poco sentido porque la salida de ese findcomando normalmente consistirá en líneas como:

/ddomain/data/shop12/foo
/ddomain/data/shop12/foo/bar
...

La única forma de que esa salida contenga líneas con un solo carácter es si hay un archivo cuyo nombre sea algo así como foo<newline>X<newline>. Eso es perfectamente posible, pero yo diría que es poco probable que fuera la intención de ese comando.

Posiblemente, ese comando fue adaptado (incorrectamente) de:

find . -mtime +15 -print | grep -v '^.$' | grep data-

Donde se greppretendía filtrar la .entrada (incluso entonces, grep -Fvx .habría sido más apropiado). Sin embargo, entonces habría tenido más sentido escribirlo:

find . ! -name . -path '*data-*' -mtime +15

Si desea filtrar el directorio de nivel superior con find /ddomain/data/shop12/, lo haría de la siguiente manera:

find /ddomain/data/shop12/. ! -name . -path '*data-*' -mtime +15

O si su findimplementación admite el -mindepthpredicado:

find /ddomain/data/shop12/ -mindepth 1 -path '*data-*' -mtime +15

Respuesta3

Elimina el .directorio de la lista de findresultados. Es más fácil de explicar con un ejemplo:

find . -print
.
./prova2
./prova2/prova2  

find . -print | grep -v '^.$'
./prova2
./prova2/prova2  

Como puedes ver, en el primer fragmento de código encontramos el .resultado. Entonces, lo pasas a las acciones realizadas por el forciclo.
En el segundo fragmento, decides omitir el .directorio de los resultados de find, para no enviarlo al forciclo.

Respuesta4

grep -v '^.$'excluye líneas con un solo carácter.

Ejemplo:

echo "foo
> bar
> x" | grep -v '^.$'
foo
bar

información relacionada