usando regex com find

3

Digamos que eu precise encontrar todos os arquivos em /var/log/ , exceto btmp , lastlog , wtmp . E eu só preciso de profundidade 1. Eu tentei com o seguinte comando find , mas isso não funciona como esperado:

find /var/log/ -maxdepth 1 -type f \! -name '(btmp|lastlog|wtmp)'

Alguém pode, por favor, aconselhar como fazer isso?

    
por Martin Vegter 13.12.2013 / 21:41

5 respostas

2

Isso deve realizar o que você deseja:

find /var/log/ -maxdepth 1 -type f \! -regex '/var/log/\(btmp\|lastlog\|wtmp\)' -exec ls {} \;
    
por 13.12.2013 / 22:02
2

-name não recebe uma expressão regular, é necessário um nome literal, potencialmente com globs. Você pode usar -regex (possivelmente uma extensão do gnu?) Ou adicionar os três separadamente

find ... \! -name btmp \! -name lastlog \! -name wtmp

Ou você pode pular find inteiramente e usar o globbing estendido do bash.

shopt -s extglob
echo !(btmp|lastlog|wtmp)
    
por 13.12.2013 / 21:49
2

Aqui está outra maneira de fazer isso:

ls -1 /var/log/ | grep -v 'btmp\|lastlog\|wtmp'

ou para não incluir diretórios:

find /var/log/ -maxdepth 1 -type f | grep -v 'btmp\|lastlog\|wtmp'
    
por 13.12.2013 / 22:06
0

Isso também funcionará.

find /var/log -maxdepth 1 -regextype posix-extended -type f ! -regex '^.*/(btmp|wtmp|lastlog)$'
    
por 20.11.2015 / 10:53
0
find /var/log ! \
      \( -name \[wb]tmp -o \
         -name lastlog  -o \
         -path '*g/*/*/*'  \
         -prune -o -type d \)

Isso imprimirá apenas nomes de caminho que não sejam do tipo diretório, de nomes básicos wtmp, btmp ou lastlog, ou sejam mais profundos que um único diretório abaixo de um nome de diretório que termine com g.

    
por 20.11.2015 / 11:53

Tags