PERMISSÕES MAIS USADAS EM PASTAS E ARQUIVOS COM EXEMPLOS
.
As permissões são usadas para definir quem pode acessar determinados arquivos ou diretórios, assim mantendo segurança e organização em sistemas e redes. Cada arquivo ou pasta tem 3 permissões:
(Usuário Dono) (Grupo Dono) (outros)
.
Usuário dono: é o proprietário do arquivo. Grupo Dono: é um grupo, que pode conter vários usuários. Outros: se encaixam os outros usuários em geral. O comando "ls -lh" faz uma listagem longa e detalhada no diretório onde eu estiver com o terminal aberto.
.
PARA ENTENDER AS PERMISSÕES DE PASTAS E ARQUIVOS, VOU FAZER O SEGUINTE:
.
Abro o terminal pelo menu do sistema. Não sou root, sou um usuário comum com alguns poderes administrativos, mas o prompt do terminal não está em root (#) está ($).
.
CRIO UMA PASTA COM O COMANDO:
mkdir pasta-estudo-permissoes
.
ENTRO NA PASTA COM O COMANDO:
cd pasta-estudo-permissoes/
.
CRIO UM ARQUIVO DE TEXTO CHAMADO estudo-permissoes.txt COM O COMANDO:
> estudo-permissoes.txt
.
CRIO OUTRO ARQUIVO COM O COMANDO:
touch permissoes-estudos.txt
.
CRIO OUTRA PASTA CHAMADA: pastinha-estudos
.
mkdir pastinha-estudos
.
DIGITO:
ls -lh
.
O RESULTADO É:
pasta-estudo-permissoes $ls -lh
total 0
-rw-rw-r-- 1 user user 0 mar 8 05:15 estudo-permissoes.txt
-rw-rw-r-- 1 user user 0 mar 8 05:16 permissoes-estudos.txt
.
AS PERMISSÕES DE ARQUIVOS SÃO INFORMADAS A MIM POR 5 CARACTERES. SÃO ELES:
r (significa leitura ), w (significa escrita ), x (significa execução ), - (hífen), d (indica que é uma pasta/diretório)
.
A PERMISSÃO DE ARQUIVOS E PASTAS ESTÁ DIVIDIDA EM QUATRO PARTES POR EXEMPLO:
Parte 1: -, Parte 2: rw-, Parte 3: r--, Parte 4: r--
.
NO TERMINAL ESTAS QUATRO PARTES SERÃO VISTAS ASSIM:
-rw-r--r--
.
EXEMPLO:
-rw-rw-r-- 1 user user 0 mar 8 05:15 estudo-permissoes.txt
.
Parte 1 (-)
hífen: o caractere "-" no início da sequência indica que aquele é um arquivo comum. Caso contrário, indica que a permissão de escrita, leitura ou execução está negada.
.
Parte 2 (rw-)
r: leitura permitida do arquivo ou diretório
.
w: permite editar um arquivo ou modificar o conteúdo de um diretório
.
hífen: o caractere "-" no início da sequência indica que aquele é um arquivo comum. Caso contrário, indica que a permissão de escrita, leitura ou execução está negada.
.
Parte 3 (r --)
r: leitura permitida do arquivo ou diretório
.
hífen: o caractere "-" no início da sequência indica que aquele é um arquivo comum. Caso contrário, indica que a permissão de escrita, leitura ou execução está negada.
.
hífen: o caractere "-" no início da sequência indica que aquele é um arquivo comum. Caso contrário, indica que a permissão de escrita, leitura ou execução está negada.
.
Parte 4 (r--)
r: leitura permitida do arquivo ou diretório
.
hífen: o caractere "-" no início da sequência indica que aquele é um arquivo comum. Caso contrário, indica que a permissão de escrita, leitura ou execução está negada.
.
hífen: o caractere "-" no início da sequência indica que aquele é um arquivo comum. Caso contrário, indica que a permissão de escrita, leitura ou execução está negada.
.
EU POSSO ALTERAR AS PERMISSÕES DESTES ARQUIVOS USANDO CHMOD.
.
O CHMOD É UM COMANDO QUE ALTERA AS PERMISSÕES DE ARQUIVOS E DIRETÓRIOS.
.
APRENDER COMO INTERPRETAR AS PERMISSÕES AJUDA A USAR O COMANDO CHMOD, POIS QUE ESSE COMANDO TRABALHA COM UMA SINTAXE SEMELHANTE.
.
A "FÓRMULA" DE USO MAIS SIMPLES DO CHMOD É:
chmod ugoa+-=rwx arquivo/diretório
.
SENDO QUE:
u: define que as regras serão aplicadas ao usuário
g: define que as regras serão aplicadas ao grupo
o: define que as regras serão aplicadas aos outros usuários do sistema
a: define que as regras serão aplicadas a todos
+: adiciona permissão
-: remove permissão
=: informa que a permissão aplicada deve ser exatamente igual a que será indicada a seguir
r: atribui a permissão de leitura
w: atribui a permissão de escrita
x: atribui a permissão de execução
.
COM ESTE PEQUENO/GRANDE CONHECIMENTO ADQUIRIDO, POSSO EXECUTAR UM COMANDO ALTERANDO AS PERMISSÕES DE UM ARQUIVO QUE EU CRIEI. O ARQUIVO "permissoes-estudos.txt".
.
EXECUTO NO TERMINAL:
sudo chmod g+w permissoes-estudos.txt
.
O chmod precisa ser usado com o comando sudo, pois apenas o usuário root tem a permissão de executá-lo. Depois de informar a senha e de ter concluído a execução, basta listar o arquivo com o ls -l para conferir a nova permissão. Percebo que onde antes era r--, agora se tornou rw-
.
CASO QUEIRA REMOVER A PERMISSÃO DE LEITURA, ESCRITA E EXECUÇÃO DE PESSOAS QUE NÃO PERTENCEM AO GRUPO, USO:
sudo chmod o-rwx permissoes-estudos.txt
.
Vai ficar assim:
-rw-rw----
.
SE QUISER DAR A PERMISSÃO DE ESCRITA E LEITURA PARA TODOS OS USUÁRIOS DO SISTEMA, BASTA EXECUTAR:
sudo chmod a+rw permissoes-estudos.txt
.
O PARÂMETRO a+rw VAI APENAS ADICIONAR A PERMISSÃO DE LEITURA E ESCRITA, ISTO É, CASO O DONO DO ARQUIVO, GRUPO E OUTROS USUÁRIOS JÁ POSSUAM A PERMISSÃO DE EXECUÇÃO, ELA NÃO SERÁ REVOGADA. SE EU QUISER IMPOR A REGRA DE APENAS LEITURA E ESCRITA, REVOGANDO UMA PERMISSÃO DE EXECUÇÃO PRÉ-EXISTENTE, USO O SINAL DE IGUAL:
sudo chmod a=rw permissoes-estudos.txt
.
O resultado será:
-rw-rw-rw-
.
OUTRA FORMA DE USAR O CHMOD
.
Existe mais de uma forma de usar o chmod e muitos preferem esta segunda, que aprenderei a seguir. Em vez de digitar letras e operadores matemáticos, como o caso de a+rw, por exemplo, alguns preferem estipular as permissões com códigos numéricos.
.
PARA ISSO, VOCÊ PRECISA PENSAR NA REGRA DE PERMISSÃO COMO SE FOSSE UMA SEQUÊNCIA DE BITS. A PERMISSÃO rwx, POR EXEMPLO, EQUIVALERIA A 111, ENQUANTO QUE rw- SE TRANSFORMARIA EM 110. RESUMINDO: 1 PARA LETRA, 0 PARA HÍFEN. CONVERTER ESSES NÚMEROS DE BASE BINÁRIA PARA DECIMAL, 111 VIRARIA 7, ENQUANTO QUE 110 SE TORNARIA 6.
.
VEJA O EXEMPLO ABAIXO BEM FÁCIL:
.
rwx
111
7
rw-
110
6
.
SEGUINDO ESSA LÓGICA, SE VOCÊ QUISESSE FORNECER AS PERMISSÕES DE LEITURA, ESCRITA E EXECUÇÃO PARA TODOS OS USUÁRIOS DO SISTEMA, PODERIA DIGITAR A SEGUINTE LINHA:
sudo chmod 777 nome-do-arquivo
sudo chmod 777 permissoes-estudos.txt
.
SE PREFERIR MANTER A OPÇÃO DE EXECUTAR O ARQUIVO APENAS PARA O DONO E GRUPO DELE, ENTÃO A LINHA MUDA PARA:
sudo chmod 776 permissoes-estudos.txt
.
PARA FACILITAR E NÃO TER QUE CONVERTER DE CABEÇA TODOS ESSES NÚMEROS, EXISTE UMA PEQUENA TABELA DE APENAS OITO (8) PERMISSÕES, QUE PODE SER CONSULTADA SEMPRE QUE NECESSÁRIO:
.
Permissão1: 0 ; Permissão2: 1 ; Permissão3: 2 ; Permissão4: 3 ; Permissão5: 4 ; Permissão6: 5 ; Permissão7: 6 ; Permissão8: 7. Onde a:
.
# A permissão 1:
---
Convertida para binário:
000
Tem o decimal:
0
# A permissão 2:
--x
Convertida para binário:
001
Tem o decimal:
1
# A permissão 3:
-W-
Convertida para binário:
010
Tem o decimal:
2
# A permissão 4:
-WX
Convertida para binário:
011
Tem o decimal:
3
# A permissão 5:
r--
Convertida para binário:
100
Tem o decimal:
4
# A permissão 6:
r-x
Convertida para binário:
101
Tem o decimal:
5
# A permissão 7:
rw-
Convertida para binário:
110
Tem o decimal:
6
# A permissão 8:
rwx
Convertida para binário:
111
Tem o decimal:
7
.
CASO NÃO HAJA TODAS AS PERMISSÕES, PODERÁ APARECER INCOMPLETO:
rwxrw_ _ _x, ou seja, neste exemplo:
Dono do arquivo tem permissão de Ler, Escrever e executar (rwx).
Grupo tem permissão de Ler e Escrever (rw_).
Outros tem permissão apenas de executar. (_ _ x).
.
CONCLUSÃO:
.
EXISTEM DOIS MODOS DE DEFINIR UMA PERMISSÃO, ATRAVÉS DO MODO OCTAL E MODO TEXTUAL.
.
TEXTUAL - Usamos letras antes das permissões (chmod é o comando para modificar permissões de arquivos):
$ chmod u+rw, g+w, o-rwx permissoes-estudos.txt
Onde:
U - representa usuário;
G - representa grupo;
O - representa outros.
ugo
.
Executo:
sudo chmod u+rw permissoes-estudos.txt
ls -lah
sudo chmod g+w permissoes-estudos.txt
ls -lh
sudo chmod o-rwx permissoes-estudos.txt
ls -l
.
MODO OCTAL
.
O modo Octal tem a mesma função de definir permissões, só que em números. Exemplo:
$ sudo chmod 620 permissoes-estudos.txt
$ ls -lh
.
(comando) (permissão) (arquivo)
.
Tipo de permissão Octal:
4 - Indica permissão de leitura;
2 - Permissão de escrita;
1 - Indica permissão de execução;
0 - Indica sem permissões.
.
Agora é simples, é só somar e ditar as permissões, exemplo:
4 + 2 + 1 = 7 (permissão de rwx)
4 + 2 = 6 (permissão rw)
4 = (permissão r)
.
Exemplo: A permissão 610 indica que o arquivo tem permissão:
6 para dono do arquivo
1 para grupo e
0 para outros ou seja
dono= (rw_) Grupo=(_ _ x) outros=(_ _ _)
.
Percebo que quando é feita a listagem longa "ls -l", o primeiro caractere não é uma permissão.
.
O primeiro caracter "d" indica o tipo do arquivo, neste caso "d" indica que é um diretório.
.
Existem também outras permissões especiais mas não quero saber no momento.
.
Com um pouco de prática talvez um dia eu esteja alterando permissões de arquivos e diretórios de maneira automática. Mas eu garanto que você e eu, não vamos esquecer do que faz um chmod 777.
.
LINUX E O PODEROSO COMANDO FIND
.
EXEMPLOS DO COMANDO FIND
.
O QUE É O COMANDO FIND?
.
O comando find no Linux é usado para pesquisa de arquivos, porém pode fazer mais que isto. Por exemplo:
.
Se estiver com problemas para apagar um arquivo/ficheiro, dado que o nome do arquivo/ficheiro é meio estranho, descubra o INODE do ficheiro com o comando ls:
.
ls -il
.
E DEPOIS APAGUE DESTA FORMA:
.
find -inum 117672808 -exec rm {} \;
.
O COMANDO FIND CONSEGUE PESQUISAR ARQUIVOS BASEADOS EM VÁRIOS CRITÉRIOS DE BUSCA COMO PERMISSÕES, PROPRIEDADES, DATA DE MODIFICAÇÃO, ETC.
.
Este é um comando a ser aprendido pois, dizem que, conhecendo o que puder dele (find), o usuário passa a se sentir mais confortável com o sistema GNU/Linux.
.
A FORMA BÁSICA É:
.
find + onde-quer-pesquisar + critérios-de-busca + o-que-você-procura
.
find /Documentos -name teste (quero pesquisar em "/Documentos", o critério de busca "-name" diz que eu quero achar a palavra "teste")
.
find /Downloads *.pdf (quero pesquisar em "/Downloads", o critério de busca "*" diz que eu quero achar tudo que tem a extensão ".pdf")
.
EXEMPLOS BÁSICOS
.
1. Listar todos os arquivos do diretório corrente
.
ESTE COMANDO LISTA TODOS OS ARQUIVOS DO DIRETÓRIO CORRENTE BEM COMO SEUS SUBDIRETÓRIOS.
$ find
.
./abc.txt
./subdir
./subdir/how.php
./cool.php
O comando acima é o mesmo que
$ find .
$ find . - print
.
2. Pesquisar num caminho ou diretório específico
.
ESTE COMANDO VAI PESQUISAR POR ARQUIVOS NO DIRETÓRIO TEST DO DIRETÓRIO CORRENTE. POR PADRÃO VAI LISTAR TODOS OS ARQUIVOS DENTRO DE TEST.
.
$ find ./test
./test
./test/abc.txt
./test/subdir
./test/subdir/how.php
./test/cool.php
O COMANDO ABAIXO PESQUISA ARQUIVOS PELO NOME
$ find ./test -name abc.txt
./test/abc.txt
Também é possível utilizar coringas
$ find ./test -name *.php
./test/subdir/how.php
./test/cool.php
# PERCEBA QUE TODOS OS SUBDIRETÓRIOS SÃO PESQUISADOS RECURSIVAMENTE.
# ISTO É MUITO ÚTIL NA BUSCA DE ARQUIVOS NUMA ESTRUTURA GRANDE DE DIRETÓRIOS
.
INAME - IGNORANDO O CASE-SENTIVE
.
As vezes não sabemos se o nome está com letras maiúsculas ou minúsculas.
Para ignorar esta diferença, basta utilizar a opção "- iname" sem aspas no lugar de name.
.
$ find ./test -iname *.Php
./test/subdir/how.php
./test/cool.php
3. LIMITE DE PROFUNDIDADE DA PESQUISA
.
O comando find, por padrão, percorre toda a árvore de diretórios de forma recursiva.
No entanto, a profundidade da pesquisa pode ser especificada.
Por exemplo, nós não queremos ir mais de 2 ou 3 níveis para baixo nos sub-diretórios.
Isso é feito usando a opção maxdepth.
.
$ find ./test -maxdepth 2 -name *.php
./test/subdir/how.php
./test/cool.php
$ find ./test -maxdepth 1 -name *.php
./test/cool.php
O segundo exemplo usa maxdepth de 1, o que significa que ele não vai mais baixo do que um nível mais profundo, ou apenas no diretório atual.
.
Isto é muito útil quando queremos fazer apenas no diretório atual ou no máximo um nível de sub-diretórios de profundidade e não de toda a árvore de diretórios que levaria mais tempo uma busca limitada.
.
Assim como maxdepth existe uma opção chamada mindepth que faz o que o nome sugere, ou seja, ele vai pelo menos nível N profunda antes de procurar os arquivos.
.
4. INVERTENDO A PESQUISA
.
Também é possível pesquisar por arquivos que não fazem nenhum critério no padrão determinado. Isso é útil quando se sabe quais arquivos serão excluídos da pesquisa.
$ find ./test -not -name *.php
./test
./test/abc.txt
./test/subdir
Assim, no exemplo acima, encontramos todos os arquivos que não têm a extensão do PHP, ou arquivos não-php. O comando find também suporta o ponto de exclamação no lugar de not.
find ./test ! -name *.php
.
5. COMBINE MÚLTIPLOS CRITÉRIOS DE BUSCA
.
É possível usar vários critérios, por exemplo especificar nome e negar certos arquivos.
$ find ./test -name 'abc*' ! -name '*.php'
./test/abc.txt
./test/abc
O comando find acima procura por arquivos que começam com abc em seus nomes e que não têm uma extensão php. Este é um exemplo de quão poderoso expressões de busca pode ser construído com o comando find.
.
operador OR
.
Ao usar vários critérios de nome, o comando find seria combiná-los com operador AND, o que significa que apenas os arquivos que satisfaçam todos os critérios serão correspondidos. No entanto, se precisamos executar uma correspondência com base OU então o comando find tem a opção "o".
$ find -name '*.php' -o -name '*.txt'
./abc.txt
./subdir/how.php
./abc.php
./cool.php
A busca de comando acima funciona para os arquivos que terminam em qualquer extensão php ou txt.
.
6. PESQUISAR SOMENTE OS ARQUIVOS OU SOMENTE OS DIRETÓRIOS
Às vezes queremos encontrar apenas os arquivos ou somente os diretórios com um determinado nome. Find pode fazer isso facilmente também.
$ find ./test -name abc*
./test/abc.txt
./test/abc
SOMENTE ARQUIVOS
$ find ./test -type f -name abc*
./test/abc.txt
SOMENTE DIRETÓRIOS
$ find ./test -type d -name abc*
./test/abc
MUITO ÚTIL E PRÁTICO!
.
7. PESQUISAR VÁRIOS DIRETÓRIOS JUNTOS
.
Então, digamos que você deseja pesquisar dentro dois diretórios separados. Mais uma vez, o comando é muito simples
$ find ./test ./dir2 -type f -name abc*
./test/abc.txt
./dir2/abcdefg.txt
Veja, que foi listado os arquivos a partir de 2 diretórios separados.
.
8. ENCONTRE OS ARQUIVOS OCULTOS
.
Arquivos ocultos no linux começam com um ponto. Então, é fácil usar os critérios de nome e listar todos os arquivos ocultos.
$ find ~ -type f -name ".*"
.
9. LOCALIZAR ARQUIVOS COM DETERMINADAS PERMISSÕES
.
O comando find pode ser usado para encontrar arquivos com uma permissão específica usando a opção "perm". Os seguintes comando procuram arquivos com a permissão 0664
.
$ find . -type f -perm 0664
./abc.txt
./subdir/how.php
./abc.php
./cool.php
Isto pode ser útil para encontrar arquivos com permissões erradas que podem levar a problemas de segurança. Inversão também pode ser aplicada a verificação de autorização.
.
$ find . -type f ! -perm 0777
./abc.txt
./subdir/how.php
./abc.php
./cool.php
10. Localizar arquivos com sgid / bits suid definido
.
A opção "perm" do comando find aceita a mesma seqüência modo como chmod. O comando a seguir localiza todos os arquivos com permissão 644 e conjunto de bits SGID.
# find / -perm 2644
.
A opção perm também suporta o uso de uma sintaxe alternativa em vez de números octais.
$ find / -maxdepth 2 -perm /u=s 2>/dev/null
/bin/mount
/bin/su
/bin/ping6
/bin/fusermount
/bin/ping
/bin/umount
/sbin/mount.ecryptfs_private
.
Note que o "2> / dev / null" remove as entradas que têm um erro de "Permission Denied"
.
UNS 20 COMANDOS FIND PARA NÃO ESQUECER:
.
1 - Procura simples
.
find . -name arquivo.txt
./arquivo.txt
find comando
/ significa que vai procurar em todo o diretório raíz, se você não for root, ele ignorará os diretórios com permissão.
. significa que vai procurar em todo o diretório que você está e nos sub-diretórios.
-name vai procurar exatamente esse nome, se um caracter for diferente ou maiúsculo ou minúsculo, ele ignorará.
arquivo.txt nome do arquivo
.
2 - Procura ignorando case sensitive
find /home/ -iname arquivo.txt
./arquivo.txt
./Arquivo.txt
/home/ só vai procurar nesse diretório recursivamente (sub-diretórios)
iname com maiúsculo ou minúsculo
.
3 - Procura diretórios
.
find / -type -d -name Fotos arquivo.txt
/home/user/Fotos
.
4 - Procura com coringas
find /home/ -name *rquivo*
./home/arquivo.txt
./home/Arquivo.txt
./home/Meus_Arquivo-NOVOS.txt
./home/arquivo.sh
Arquivo encontra todos os arquivos que possuirem a palavra “rquivo” no início, meio ou fim
.
5 - Procura por tipo de arquivos
find / -type -f -name Fotos *.odt
./arquivo.odt
./terminalroot.odt
-f só o arquivos com extensão odt, nesse caso, mesmo sem o -f também encontraria
.
6 - Procura por permissão e encontra todos os arquivos que possuem permissão 777
find . -type f -perm 0777 -print
.
7 - Procura diferente de permissão encontra todos arquivos que não possuem a permissão 777
find / -type f ! -perm 777
.
8 - Procura arquivos os diretórios vazis sem dizer se é -type d ou -type f ele procura ambos
find MinhaPasta/ -empty
MinhaPasta/DirVazio
MinhaPasta/arquivoVazio.txt
-type d procura só diretórios
find MinhaPasta/ -type d -empty
MinhaPasta/DirVazio
-type f procura só arquivos
find MinhaPasta/ -type f -empty
MinhaPasta/arquivoVazio.txt
.
9 - Procura pastas ocultas
find /tmp -type f -name ".*"
.
10 - Procura por tamanho vai encontrar todos os arquivos maiores que 10 MB
find . -type f -size +10M
Vai encontrar todos os arquivos menores que 10 MB
find . -type f -size -10M
.
11 - Procura e remove com -exec
find . -type f -name arquivoVazio.txt -exec rm -f {} \;
Ou com xargs
find . -type f -name arquivoVazio.txt | xargs rm -f
.
12 - Procura por nome dentro do arquivo
find MeusArquivos/ -name "*.*" -exec grep -Hin "Anomalias" {} \;
MeusArquivos/arquivo.txt:1:Anomalias
.
13 - Procura arquivos ACESSADOS (atime) nas últimas 24 horas (para mais de 3 dias , use +3)
find . -type f -atime -1 -exec ls -l {} \;
.
14 - Procura arquivos ACESSADOS (amin) nos últimos 5 minutos
find . -type f -amin -5
.
15 - Procura arquivos CRIADOS (ctime) nas últimas 12 horas
find . -type f -ctime -0.5 -exec ls -l {} \;
.
16 - Procura arquivos MODIFICADOS (mtime) nas últimas 6 horas
find . -type f -mtime -0.25
.
17 - Procura arquivos do tipo Sticky Bit com permissão 551
find / -perm 1551
.
18 - Procura arquivos SUID
find / -perm /u=s
.
19 - Procura arquivos SGID
find / -perm /g+s
.
20 - Procura arquivos executáveis
find / -perm /a=x
ou só para Leitura
find / -perm /u=r
.
EXISTEM MAIS POSSIBILIDADES, VOCÊ PODE VER TODAS NO MANUAL DO COMANDO:
man find
.
Ou com o comando --help , que faz um resumo da utilização do comando find
.
USAR O COMANDO FIND NO LINUX COM BASE NO NOME DO FICHEIRO
.
Imagine que você precisa de procurar um ficheiro de imagem com o nome articles.jpg, dentro duma instalação Joomla, alojada num servidor Linux. Na document root, execute o comando:
find . -name "articles.jpg"
O output será:
./images/stories/articles.jpg
.
SE QUISERMOS TAMBÉM EXECUTAR ALGUM COMANDO NO FICHEIRO, COMO, POR EXEMPLO, ALTERAR AS PERMISSÕES DO FICHEIRO:
find . -name "articles.jpg" -exec chmod 644 {} \;
Se quiser por exemplo pesquisar o mesmo nome de ficheiro dentro da pasta images:
find images -name "articles.jpg"
SE PREFERIR USAR UM CAMINHO FÍSICO ABSOLUTO:
find /home/username/public_html/images -name "articles.jpg"
Se precisar de pesquisar o nome do ficheiro, mas sem que a pesquisa seja CASE SENSITIVE, experimente:
find . -iname "Articles.jpg"
Veja a diferença com:
find . -iname "Articles.jpg" -exec ls -l {} \;
ou
find . -iname "Articles.jpg" -print0 | xargs -0 ls -l
Usar O Comando find No Linux Com grep Para Pesquisar Uma string Ou Texto
.
IMAGINE QUE PRECISAMOS ENCONTRAR UM PEDAÇO DE CÓDIGO NUM DOS FICHEIRO PHP DO JOOMLA, MAS NÃO SABEMOS EM QUAL. VAMOS PESQUISAR A PALAVRA JOOMLA EM TODOS OS FICHEIROS PHP:
.
find . –name "*.php" -print0 | xargs -0 grep -Hin "joomla"
ou
find . –name "*.php" -exec grep -Hin "joomla" {} \;
E a ficheiros/pastas PHP alterados nas últimas 48 horas:
find . –name "*.php" -mtime -2 -exec grep -Hin --color=always "joomla" {} \;
Finalmente, vamos limitar o output aos ficheiros que incluem a string joomla, substituindo o grep -Hin com o grep -l:
find . –name "*.php" -print0 | xargs -0 grep -l "joomla"
ou
find . –name "*.php" -exec grep -l "joomla" {} \;
E se quisermos pesquisar em todos os ficheiros php e html?
find . \( -name "*.php" -o -name "*.html" \) -print0 | xargs -0 grep -Hin "joomla"
.
SE NÃO QUISERMOS USAR O FIND PARA RESTRINGIR A PESQUISA A DETERMINADOS TIPO DE FICHEIROS, A INTERVALOS DE DATA E TEMPO, A TAMANHOS DE FICHEIROS, PODEMOS USAR APENAS:
.
grep -Hirn --color=always joomla *
.
Autopsiando o grep -Hirn –color=always
-H imprime o nome dos ficheiros e respectivo caminho físico (no exempo supra, poderíamos prescindir o H - imprime por defeito)
-i pesquisa sem que seja CASE-SENSITIVE
-r faz uma pesquisa recursiva
-n imprime a linha no código onde se encontra a string pesquisada
--color=always usa cores no output de modo a tornar o output mais apresentável
.
SE QUISER EXCLUIR UM DIRETORIO DA PESQUISA:
--exclude-dir=dir
Usar O Comando find No Linux Com Base No Inode Do Ficheiro
.
SE ESTIVER COM PROBLEMAS PARA APAGAR UM FICHEIRO, DADO QUE O NOME DO FICHEIRO É MEIO ESTRANHO, DESCUBRA O INODE DO FICHEIRO COM O COMANDO ls:
ls -il
.
E DEPOIS APAGUE DESTA FORMA:
.
find -inum 117672808 -exec rm {} \;
.
Usar O Comando find No Linux Para Fintar O Error Argument List Too Long
.
Já tentou listar os ficheiros num diretório para retornar o erro:
bash: /bin/ls Argument list too long
.
Experimente:
find . -type f -print0 | xargs -0 ls -l
ou
find . -maxdepth 1 -print0 | xargs -0 ls -l
ou ainda
find . -maxdepth 1 -type f -exec ls -l {} \; | less
.
Já encontrou a partição /tmp quase cheia e precisou de apagar os ficheiros, mas deparou com o erro
bash: /bin/rm: Argument list too long
.
TENHA ESPECIAL CUIDADO COM QUALQUER COMANDO QUE APAGUE ARQUIVOS/PASTAS/FICHEIROS…
.
Vamos apagar os ficheiros, mas sem apagar quaisquer pastas e respectivos ficheiros e vamos deixar os links simbólicos (noto que o find por defeito não segue os links simbólicos):
find . -maxdepth 1 -type f -exec rm -f {} \;
.
O comando deve ser executado dentro da pasta /tmp
alternativa:
find . -maxdepth 1 -type f -print0 | xargs rm -f
.
Vamos agora usar a opção -delete do find:
find /tmp -maxdepth 1 -type f -delete
Usar O Comando find No Linux Com Base Nas Permissões Dos Ficheiros
.
Vamos agora pesquisar ficheiros com permissões 777 dentro dessa instalação do Joomla:
find . -perm 0777 -type f -exec ls -l {} \;
e pesquisar pastas com permissões 777:
find . -perm 0777 -type d -exec ls -l {} \;
Usar O Comando find No Linux Com Base No Tamanho Dos Ficheiros
.
JÁ TENTOU PESQUISAR OS 10 MAIORES FICHEIROS DENTRO DUMA INSTALAÇÃO JOOMLA OU ATÉ DENTRO DUMA PARTIÇÃO?
.
find . -type f -exec ls -s {} \; | sort -n -r | head -10
.
NESTE EXEMPLO, A LISTAGEM POR TAMANHO DADO PELO COMANDO LS -S É MUITO IMPORTANTE. VEJA COMO É DIFERENTE DO USO DO COMANDO LS NOUTROS EXEMPLOS, ONDE USAMOS LS -L. EXPERIMENTE OS 2 COMANDOS:
ls -l
ls -s
.
O COMANDO PARA PESQUISAR OS 10 FICHEIROS MAIS PEQUENOS É EXACTAMENTE IGUAL, COM A DIFERENÇA DA PARTE DO COMANDO QUE ORDENA OS FICHEIROS:
sort -n -r
aqui a ordem é descendente.
.
PARA PESQUISAR OS 10 FICHEIROS MAIS PEQUENOS, USE:
sort -n
.
PORTANTO, O COMANDO COMPLETO É:
find . -type f -exec ls -s {} \; | sort -n | head -10
.
E SE PRECISARMOS DE PESQUISAR FICHEIROS MAIORES QUE 100 MB:
find . -size +100M -exec ls -s {} \;
.
PARA PESQUISAR FICHEIROS VAZIOS, PODEMOS EXECUTAR ESTE COMANDO:
find . -empty -exec ls -l {} \;
Usar O Comando find No Linux Com Base No Tipo De Ficheiros
.
SE QUISERMOS PESQUISAR LINK SIMBÓLICOS:
find . -type l -exec ls -l {} \;
.
VEJA A DIFERENÇA, SE EXECUTAR APENAS:
find . -type l
.
PARA PESQUISARMOS FICHEIROS ESCONDIDOS:
find . -type f -name ".*"
.
JÁ EXPERIMENTAMOS VÁRIOS EXEMPLOS ONDE PASSAMOS AO COMANDO FIND O TIPO DE FICHEIRO A PESQUISAR:
-type f (ficheiro)
-type l (link simbólico)
-type d (diretório)
.
USAR O COMANDO FIND NO LINUX COM BASE NA DATA E NO TEMPO DOS FICHEIROS
Vamos agora pesquisar todos os ficheiros que foram acedidos nas últimas 24 horas:
find . -type f -atime -1 -exec ls -l {} \;
.
E TODOS OS FICHEIROS QUE FORAM MODIFICADOS NAS ÚLTIMAS 24 HORAS:
find . -type f -mtime -1 -exec ls -l {} \;
Agora, em vez de nas últimas 24 horas, vamos pesqusiar os ficheiros que foram modificados ontem:
find . -type f -mtime -1 -daystart -exec ls -l {} \;
Ao adicionar a opção -daystart, contamos as 24 horas a contar do início do dia de ontem.
Hoje, é Terça. Imagine que queremos saber que ficheiros foram modificados durante o fim de semana:
find . -type f -mtime 2 -mtime -3 -daystart -exec ls -l {} \;
.
VAMOS ANALISAR AS 3 OPÇÕES DE TEMPO:
-mtime = quando alteramos o conteúdo do ficheiro
-ctime = quando o inode associado ao ficheiro foi alterado - alterado sempre que alteramos o conteúdo, mas também quando mudamos o dono, as perrmissões do ficheiro, quando movemos para outra pasta
-atime = quando o ficheiro foi lido pela última vez
.
UM EXERCÍCIO QUE PROPONHO QUE VOCÊ FAÇA É CONJUGAR AS VÁRIAS OPÇÕES QUE ESTOU A EXEMPLIFICAR NESTE TUTORIAL. ADAPTE ESTES EXEMPLOS ÀS SUAS NECESSIDADES.
.
VOU SUGERIR CRIAR ALGUNS DIRETÓRIOS E ARQUIVOS QUE SERÃO USADOS NOS EXEMPLOS DESTE ARTIGO.
.
Se você quiser, pode alterar os nomes, mas não esqueça de adequar os exemplos deste texto às alterações que você fez.
Pra começar, recomendo criar um diretório e entrar nele, somente para brincar com o comando find. Abra um terminal e forneça os seguintes comandos:
mkdir exemplos_find
cd exemplos_find/
.
DENTRO DO DIRETÓRIO CRIADO, EXEMPLOS_FIND, CRIE ALGUNS ARQUIVOS:
touch Meu-TextoNovo.txt
touch Meu-Texto.txt
touch Meu-TextoFalso.txt
touch Meu-TextoAntigo.txt
.
AGORA, VAMOS CRIAR UM DIRETÓRIO BACKUP E, DENTRO DELE, VAMOS CRIAR NOVAMENTE AQUELES MESMOS ARQUIVOS:
mkdir backup
cd backup
touch Meu-TextoNovo.txt
touch Meu-Texto.txt
touch Meu-TextoFalso.txt
touch Meu-TextoAntigo.txt
… e voltamos ao diretório anterior, exemplos_find:
cd ../
ls -R
Como você pôde notar, a opção -R faz o comando ls perscrutar recursivamente outros subdiretórios
.
ENCONTRE ARQUIVOS USANDO NAME
O parâmetro name é básico no uso do comando find. No exemplo abaixo, vou mostrar como encontrar todos os arquivos de nome MeuTextoFalso.txt dentro do diretório atual e dentro dos subdiretórios deste:
find -name MeuTextoFalso.txt
./MeuTextoFalso.txt
./backup/MeuTextoFalso.txt
.
FAÇA UMA BUSCA POR NOMES DE ARQUIVOS IGNORANDO MAIÚSCULAS E MINÚSCULAS
Este é mais um exemplo do uso básico do comando find. Só que, desta vez vou usar o parâmetro iname, que ignora se as letras estão em maiúsculas ou minúsculas durante a pesquisa.
find -iname meutextoantigo.txt
./backup/MeuTextoAntigo.txt
./MeuTextoAntigo.txt
Assim, fica mais fácil, não é?
.
COMO PESQUISAR COM O FIND, LIMITANDO A RECURSIVIDADE
EM ALGUNS MOMENTOS, VOCÊ VAI TOPAR COM DIRETÓRIOS COM UMA GRANDE QUANTIDADE DE SUBDIRETÓRIO RECURSIVOS. SE VOCÊ NÃO TEM INTERESSE EM PESQUISAR “TÃO PROFUNDAMENTE”, PODE LIMITAR A RECURSIVIDADE DO COMANDO FIND.
O ARQUIVO DO SISTEMA PASSWD ESTÁ PRESENTE EM VÁRIOS SUBDIRETÓRIOS. VEJA:
find / -name passwd
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd
/usr/share/lintian/overrides/passwd
/etc/cron.daily/passwd
/etc/passwd
/etc/pam.d/passwd
UMA COISA QUE VOCÊ DEVE TER NOTADO É QUE A BUSCA FOI DEMORADA EM FUNÇÃO DE TER SIDO FEITA A PARTIR DO DIRETÓRIO RAIZ E EM TODOS OS SUBDIRETÓRIOS DO SISTEMA — EM ALGUNS DELES, VOCÊ PROVAVELMENTE NÃO TINHA PERMISSÃO PARA FAZER A BUSCA.
.
EXPERIMENTE LIMITAR A RECURSIVIDADE DO COMANDO FIND A 2 SUBNÍVEIS, ASSIM:
find / -maxdepth 2 -name passwd
find: `/root': Permissão negada
find: `/lost+found': Permissão negada
/etc/passwd
ESTA PODE SER UMA FORMA MAIS RÁPIDA DE ENCONTRAR O ARQUIVO QUE INTERESSA.
.
AUMENTE A PROFUNDIDADE DA PESQUISA DO FIND COM MINDEPTH
O parâmetro -mindepth (minimum depth, ou profundidade mínima) estabelece a partir de que nível a recursividade deve começar. Experimente:
find / -mindepth 3 -name passwd
.
OBSERVE QUE OS RESULTADOS (ABAIXO) SÃO DIFERENTES.
find: `/root': Permissão negada
find: `/home/soderberg/.cache': Permissão negada
find: `/home/lost+found': Permissão negada
find: `/sys/kernel/debug': Permissão negada
(...)
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd
/usr/share/lintian/overrides/passwd
/usr/share/doc/passwd
/etc/cron.daily/passwd
find: `/etc/cups/ssl': Permissão negada
find: `/etc/polkit-1/localauthority': Permissão negada
/etc/pam.d/passwd
Execute um comando em relação aos arquivos encontrados pelo find
Este tipo de ação é comumente usada em scripts, mas eu vou mostrar como usar na linha de comando.
Veja como fazer uma busca pelos arquivos “Meu-Texto.txt”, ignorando se as letras estão em minúsculas ou maiúsculas, e executar o programa md5sum em cada um deles. Veja como:
find -iname "meu-texto.txt" -exec md5sum {} \;
O resultado que obtive foi este:
d41d8cd98f00b204e9800998ecf8427e ./Meu-Texto.txt
d41d8cd98f00b204e9800998ecf8427e ./backup/Meu-Texto.txt
e você?
.
COMO INVERTER O RESULTADO DO COMANDO FIND
E se, ao invés de mostrar os resultados encontrados, a pesquisa exibisse os resultados diversos do que foi pedido?
Ao usar o parâmetro -not, eu vou indicar ao comando find o que eu não desejo exibir nos resultados. Veja como funciona:
find -not -iname "meu-textoantigo.txt"
No resultado, abaixo, a string “meu-textoantigo.txt” é a única que não é exibida.
.
./Meu-TextoFalso.txt
./Meu-Texto.txt
./backup
./backup/MeuTextoFalso.txt
./backup/MeuTexto.txt
./backup/MeuTextoNovo.txt
./Meu-TextoNovo.txt
Experimente remover dos resultados o nome de arquivo “meu-textofalso.txt”.
find -not -iname meutextofalso.txt
Com este comando, as duas ocorrências do arquivo “MeuTexto.txt” são exibidas e as duas do “Meu-TextoFalso.txt” são inibidas na lista. Note, ainda, que usei o texto fora das aspas, desta vez. Quando não há espaço entre as palavras, é possível dispensar as aspas.
.
./MeuTexto.txt
./backup
./backup/MeuTexto.txt
./backup/MeuTextoAntigo.txt
./backup/MeuTextoNovo.txt
./MeuTextoAntigo.txt
./MeuTextoNovo.txt
.
ENCONTRE ARQUIVOS PELAS SUAS PERMISSÕES
.
É POSSÍVEL FAZER UMA BUSCA NO SISTEMA PARA ENCONTRAR ARQUIVOS COM BASE NAS SUAS PERMISSÕES.
VOCÊ PODE:
1
Encontrar arquivos que satisfaçam determinadas condições na sua lista de permissões
2
Verificar quando um arquivo corresponde a uma determinada lista de permissões
3
Fazer uma busca pela representação octal/simbólica
.
PARA PODER MOSTRAR MELHOR O FUNCIONAMENTO DESTAS FUNÇÕES VOU PRECISAR ME AFASTAR UM POUCO DOS EXEMPLOS EM QUE VÍNHAMOS NOS BASEANDO ATÉ AGORA, NESTE PEQUENO TUTORIAL.
.
OBSERVE, NA LISTAGEM ABAIXO, AS DIFERENTES PERMISSÕES DOS ARQUIVOS:
ls -l
total 0
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 tudo para todos
-rw-r--r-- 1 root root 0 2009-02-19 20:30 todo mundo lê
---------- 1 root root 0 2009-02-19 20:31 nada para ninguém
-rw------- 1 root root 0 2009-02-19 20:29 arquivo simples
-rw-r----- 1 root root 0 2009-02-19 20:27 outros também podem ler
----r----- 1 root root 0 2009-02-19 20:27 outros só podem ler
Se você deu uma olhada nos nomes dos arquivos, deve ter percebido que estes explicam (superficialmente) os atributos de suas permissões.
Isto posto, no exemplo que segue, vou mostrar como usar o find para encontrar arquivos com permissão de leitura para um grupo, que seja do tipo arquivo (file) e executar o comando de listagem ls para ele:
find . -perm -g=r -type f -exec ls -l {} \;
O RESULTADO É ALGO PARECIDO COM ISTO:
-rw-r--r-- 1 root root 0 2009-02-19 20:30 ./todo mundo lê
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 ./tudo para todos
----r----- 1 root root 0 2009-02-19 20:27 ./outros só podem ler
-rw-r----- 1 root root 0 2009-02-19 20:27 ./outros também podem ler
COMO ENCONTRAR ARQUIVOS COM PERMISSÃO DE LEITURA APENAS PRO GRUPO, NO DIRETÓRIO ATUAL:
find . -perm g=r -type f -exec ls -l {} \;
Experimente alterar o comando e aplicá-lo a outros diretórios, para ver as mudanças nos resultados.
Como último exemplo desta secção vou mostrar como encontrar arquivos com permissão octal 0666, ou seja, podem ser lidos e alterados por todos os usuários do sistema. Primeiro, vou alterar as permissões de um dos arquivos que criamos no diretório exemplos_find:
chmod 0666 MeuTextoNovo.txt
EM SEGUIDA, FAZER A BUSCA:
find . -perm 0666 -type f -exec ls -l {} \;
O RESULTADO:
-rw-rw-rw- 1 justincase justincase 0 Mai 6 16:27 ./MeuTextoNovo.txt
Você pode fazer uma busca por arquivos executáveis (programas), assim:
find /usr/ -executable -type f -exec ls --color {} \;
.
Use o comando find para encontrar arquivos vazios
.
Para isto, use o parâmetro -empty (vazio). No exemplo, abaixo, vou mostrar como fazer a busca, no seu diretório home:
find ~ -empty
Para se restringir ao diretório atual e evitar a recursividade (busca em subdiretórios), use -maxdepth:
find . -maxdepth 1 -empty
.
Os arquivos que nós criamos, neste tutorial, através do comando touch, estão vazios — nenhum conteúdo foi inserido neles.
./MeuTextoFalso.txt
./MeuTexto.txt
./MeuTextoAntigo.txt
./MeuTextoNovo.txt
.
COMO ENCONTRAR PELO TAMANHO
.
No exemplo que segue, vou mostrar como encontrar os 7 maiores arquivos no diretório /usr/bin, incluindo seus subdiretórios
find /usr/bin/ -type f -exec ls -s {} \; | sort -n -r | head -7
A EXECUÇÃO PODE SER UM TANTO DEMORADA, DEPENDENDO DA QUANTIDADE DE ARQUIVOS ENVOLVIDA.
.
Abaixo, segue o resultado que eu obtive:
8724 /usr/bin/php5
6264 /usr/bin/audacity
5708 /usr/bin/gimp-2.8
4972 /usr/bin/gdb
4364 /usr/bin/shotwell
4168 /usr/bin/aptitude-curses
3788 /usr/bin/mplayer
.
PARA VER OS 7 MENORES, FAÇA ASSIM:
.
find /usr/bin/ -type f -exec ls -s {} \; | sort -n | head -7
O parâmetro -size pode ser usado para encontrar arquivos com um determinado tamanho ou maior do que um certo tamanho.
Veja como encontrar arquivos com tamanhos maiores que 100Mb no diretório /var:
find /sys -size +100M
/sys/devices/pci0000:00/0000:00:02.0/resource2_wc
/sys/devices/pci0000:00/0000:00:02.0/resource2
Alguns diretórios do sistema, como eu já disse, podem precisar de privilégios administrativos para mostrar seu conteúdo.
Encontrar arquivos menores do que um certo número também é fácil:
find /usr/share/icons -size -2k
Neste caso, a lista pode ser grande.
.
ENCONTRE ARQUIVOS PELO TIPO
Para encontrar arquivos do tipo socket:
find . -type s
.
PARA VER A RELAÇÃO DE DIRETÓRIOS:
find . -type d
.
./backup
ENCONTRE OS ARQUIVOS ESCONDIDOS NO SEU DIRETÓRIO PESSOAL (home):
find ~ -type f -name ".*"
.
CONCLUSÃO:
É impossível imaginar a enorme quantidade de aplicações o comando find permite, pois podemos combiná-los com a execução de outros comandos. O ls, o rm etc...
.
Alterando os exemplos deste tutorial dá para fazer com que o find execute centenas de tarefas. Depende da necessidade, criatividade e interesse do usuário. Brincando como se fosse um jogo para passar o tempo quando tem folga, acaba-se aprendendo bastante.
.