arquivo de análise de ls -laLR

1
ls -laLR /home/tools > all_site1.txt

Eu preciso do estado de todas as pastas e arquivos nas subpastas de /home/tools . Com este comando eu coloquei tudo neste arquivo. O que eu preciso agora é uma solução como analisar a partir deste arquivo all_sites1.txt apenas as linhas onde o proprietário do dir ou proprietário do arquivo é root.

Eu tentei isso:

awk '/root/{print $0}' all_sites1.txt

Mas obtenho todos os lugares em que root ocorre. Preciso apenas das entradas em que owner é root e qual arquivo e / ou diretório deve ser impresso.

    
por klerk 22.02.2014 / 15:57

3 respostas

2

Se você estiver procurando salvar o estado de pastas / arquivos, getfacl é um comando muito melhor para usar. Você poderia fazer o seguinte:

getfacl -LR /home/tools >all_site1.txt

Uma coisa a notar é que o comportamento da opção -L é diferente daquele de ls . Ele segue apenas links simbólicos para diretórios e não para arquivos.

Você pode imprimir a saída de arquivos de propriedade do root assim (desde que nenhum dos caminhos contenha novas linhas):

awk '$2=="file:" && file_line=$0 {}
  $2=="owner:" && $3=="root" { print substr(file_line,9) }' \
  all_sites1.txt
    
por 22.02.2014 / 17:04
2

Para nomes de arquivos e diretórios razoáveis (não começando com espaço, sem novas linhas), isso funciona:

ls -laLR 2>/dev/null | 
    awk 'NF>8 && ($3 == "root" || $4 == "root") '\
    '{$1=""; $2=""; $3=""; $4=""; $5=""; $6=""; $7=""; $8=""; '\
    'sub("^ *",""); print;}'

Como de costume find é a melhor solução:

find . -user root -or -group root 2>/dev/null
    
por 22.02.2014 / 16:30
0

Outra solução:

shopt -s nullglob
stat -c%n:%U:%G * .*[!.]* ..?* | awk -F: '{if( $2=="root" || $3=="root")print $1}'

Isso funcionará em arquivos apenas no diretório atual.

    
por 22.02.2014 / 18:38