O que "grep -v "^.$"" faz

O que "grep -v "^.$"" faz

Eu tenho um script para limpeza de arquivos de dados

O comando:

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

Tentei executar o comando sem a grep -vfunção e não vejo diferença.

Eu gostaria de saber o que grep -v "^.$"faz. Não criei este script e não consigo encontrar nada online.

Responder1

grep -v "^.$"imprimirá todas as linhas da entrada, exceto aquelas que possuem apenas um único caractere.

Como é usado em:

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

podemos assumir que é para descartar o diretório de trabalho atual ( .) da findsaída de (mostrado quando o caminho relativo .é usado), o que pode ser facilmente alcançado por -mindepth 1opção, embora aqui seja redundante, pois você está usando o caminho absoluto em find.

Mais tarde, você estará procurando apenas arquivos com data-nomes por grep data-, isso também é redundante. Você pode colocar toda a lógica em uma única findinvocação:

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

Solte -printtambém, é a ação padrão:

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

Apenas para observar, se você estiver procurando apenas por arquivos, adicione -type ftambém:

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

Responder2

Como já foi dito, grep -v '^.$'filtra linhas que consistem em exatamente um caractere (linhas que consistem no início da linha ( ^) seguido por um caractere ( .) seguido pelo final da linha ( $). Outra forma de escrevê-lo seria grep -vx .onde o -xtorna o ^e $implícito (as .correspondências em toda a linha).

Na saída de:

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

Isso faz pouco sentido porque a saída desse findcomando normalmente consistirá em linhas como:

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

A única maneira de essa saída conter linhas com um único caractere é se houver um arquivo cujo nome seja algo como foo<newline>X<newline>. Isso é perfeitamente possível, mas eu diria que é improvável que essa fosse a intenção desse comando.

Possivelmente, esse comando foi (incorretamente) adaptado de:

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

Onde grepse pretendia filtrar a .entrada (mesmo assim, grep -Fvx .teria sido mais apropriado). No entanto, teria feito mais sentido escrevê-lo:

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

Se você quiser filtrar o diretório de nível superior com find /ddomain/data/shop12/, faça isso da seguinte maneira:

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

Ou se sua findimplementação suportar o -mindepthpredicado:

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

Responder3

Remove o .diretório da lista de findresultados. É mais fácil explicar com um exemplo:

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

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

Como você pode ver, no primeiro trecho de código encontramos o .resultado. Então você passa para as ações realizadas pelo forciclo.
No segundo trecho, você decide pular o .diretório dos resultados de find, para não enviá-lo para o forciclo.

Responder4

grep -v '^.$'exclui linhas com apenas um caractere.

Exemplo:

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

informação relacionada