Isso deve realizar o que você deseja:
find /var/log/ -maxdepth 1 -type f \! -regex '/var/log/\(btmp\|lastlog\|wtmp\)' -exec ls {} \;
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?
-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)
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'
Isso também funcionará.
find /var/log -maxdepth 1 -regextype posix-extended -type f ! -regex '^.*/(btmp|wtmp|lastlog)$'
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.