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 -v
funció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 find
la salida de (que se muestra cuando .
se usa la ruta relativa), lo que se puede lograr fácilmente mediante -mindepth 1
una 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 find
invocación:
find /ddomain/data/shop12/ -name '*data-*' -mtime +15 -print
Soltar -print
tambié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 f
tambié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 -x
hace 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 find
comando 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 grep
pretendí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 find
implementación admite el -mindepth
predicado:
find /ddomain/data/shop12/ -mindepth 1 -path '*data-*' -mtime +15
Respuesta3
Elimina el .
directorio de la lista de find
resultados. 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 for
ciclo.
En el segundo fragmento, decides omitir el .
directorio de los resultados de find
, para no enviarlo al for
ciclo.
Respuesta4
grep -v '^.$'
excluye líneas con un solo carácter.
Ejemplo:
echo "foo
> bar
> x" | grep -v '^.$'
foo
bar