Como visualizar arquivos que possuem permissão de leitura apenas no meu diretório de trabalho atual?

0

Esta questão parece ser fácil para quem sabe encontrar o comando. Mas vamos supor que o comando find não funcione no meu sistema. Como posso visualizar os arquivos com base em suas permissões sem usar o comando "find"?

    
por Debasish 06.06.2016 / 11:21

5 respostas

2

Você pode usar ls -l em conjunto com grep :

ls -l | grep -e "-r[w-][x-][r-][w-][x-][r-][w-][x-]"

Isso mostra apenas os arquivos para os quais você leu permissão. Se você adicionar [-d] em vez do traço no início do padrão, você também obteria diretórios.

    
por 06.06.2016 / 11:35
2

Sem find , você ainda tem um shell (que pode expandir os curingas) e pode fazer um loop sobre o conteúdo do diretório verificando primeiro se cada um é um arquivo, se não for gravável e se não for executável e, em seguida, se for legível.

É provável que alguém escreva um script para demonstrar, mas é útil começar lendo a documentação, por exemplo, Teste POSIX .

A propósito, o uso de " somente " no título da questão excluiria os resultados em que o arquivo é gravável ou executável. Em POSIX find , você pode expressá-lo assim:

find . -type f \! \( -perm -u=w -o -perm -u=x -o -perm -g=w -o -perm -g=x -o -perm -o=w -o -perm -o=x \)

O GNU find fornece extensões que permitem expressões mais compactas :

find . -type f \! -perm /u=wx,g=wx,o=wx 

A utilidade test (mais usada como [ e ] ) fornece testes mais simples que find , por exemplo,

for name in *; do [ -f "$name" -a -r "$name" -a ! -w "$name" -a ! -x "$name" ] && ls -l "$name"; done

No entanto, suas permissões são apenas para o usuário , não para o grupo ou outro . Para excluir arquivos com base neles, você pode usar ls , por exemplo,

for name in *; do [ -f "$name" ] && case "$(ls -l "$name")" in -r--r--r--*) echo "$name";; esac; done

ou (se você quiser permitir arquivos executáveis)

for name in *; do [ -f "$name" ] && case "$(ls -l "$name")" in -r-?r-?r-*) echo "$name";; esac; done
    
por 06.06.2016 / 11:26
2

você pode usar

# for file in /your/path/*; do [ -r "$file" ] && [ -f "$file" ] && printf '%s\n' "$file"; done
  • -r significa, o arquivo existe e a permissão de leitura é concedida.

Para encontrar arquivos legíveis, independentemente do proprietário, grupo ou outros, você pode verificar o sinalizador r na coluna de permissão de arquivo de ls.

ls -l | awk '$1 ~ /r/'
    
por 06.06.2016 / 11:33
0

Na linha do que Thawn disse acima, visando a solução mais simples como prioridade (e supondo que você pode usar ls, desde que você não pode usar find ;

você pode fazer ls -l | grep ^.r\-\- para encontrar exatamente o que pediu "arquivos que só têm permissão de leitura ..."

Por exemplo

touch testfile.txt
chmod 0400 testfile.txt
ls -l | grep ^.r\-\-

saídas

'-r--------   1 youruser  yourgroup     0  6 Jun 11:20 testfile.txt'
    
por 06.06.2016 / 11:43
0

com zsh :

view ./*(.^f-444)

ou:

view ./*(.r,.A,.R)

Visualizaria os arquivos regulares não ocultos que possuem pelo menos um dos bits de permissão de leitura definidos. Equivalente de:

find . ! -name . -prune ! -name '.*' -type f \(
  -perm -001 -o -perm -010 -o -perm -100 \)

ou com o GNU find :

find . -maxdepth 1 ! -name '.*' -type f -perm /444

Enquanto:

view ./*(.e:'[ -r $REPLY ]':)

visualizaria os arquivos regulares não ocultos que você têm permissão para ler. Equivalente de:

find . ! -name . -prune ! -name '.*' -type f -exec test -r {} \; -print

Ou com o GNU find :

find . -maxdepth 1 ! -name '.*' -type f -readable

E:

view ./*(.f-7333^f-444)

Para visualizar arquivos regulares não ocultos onde somente bits de permissão de leitura (pelo menos um) são definidos.

Equivalente do GNU find :

find . -maxdepth 1 ! -name '.*' -perms /444 ! -perms /7333
    
por 07.06.2016 / 08:45