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 -v
funçã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 find
saída de (mostrado quando o caminho relativo .
é usado), o que pode ser facilmente alcançado por -mindepth 1
opçã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 find
invocação:
find /ddomain/data/shop12/ -name '*data-*' -mtime +15 -print
Solte -print
també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 f
també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 -x
torna 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 find
comando 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 grep
se 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 find
implementação suportar o -mindepth
predicado:
find /ddomain/data/shop12/ -mindepth 1 -path '*data-*' -mtime +15
Responder3
Remove o .
diretório da lista de find
resultados. É 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 for
ciclo.
No segundo trecho, você decide pular o .
diretório dos resultados de find
, para não enviá-lo para o for
ciclo.
Responder4
grep -v '^.$'
exclui linhas com apenas um caractere.
Exemplo:
echo "foo
> bar
> x" | grep -v '^.$'
foo
bar