Estava eu estudando para prova de certificação LPI-101, e percebi que o comando find é um dos comandos que mais possui paramêtros, então resolvi dedicar uma boa parte dos meus estudos para esse enorme comando.
O find procura por arquivos em um diretório (recursivamente) com determinadas caracteristicas. É um comando bastante flexível e repleto de opções.
Principais paramêtros:
■-atime +n | -n | n — Procura por arquivos que foram acessados há menos do que n (-n), mais do que n(+n) ou exatamente n (n) dias.
■-ctime +n | -n | n — Procura por arquivos que foram alterados há menos tempo do que n (-n), mais do que n (+n), ou há exatamente n (n) dias.
■-exec comando {} \; — Executa “comando” para cada arquivo achado pelo find.
■-name padrão — Especifica um nome de arquivo ou padrão a ser procurado. Suporta alguns caracteres curinga, que devem ser especificados entre aspas simples para não serem expandidos pelo shell.
■-iname padrão — Faz o mesmo que o parametro “-name”, porém ignora a diferença entre letras maisculas e minúsculas.
■-perm — Permissão (modo) do arquivo, especificado em octal.
■-type — Especifica um tipo de arquivo, podendo ser f para arquivo regular, d para diretório e l para link simbólico.
■-user usuario — Faz buscas por documentos os quais o “usuário” seja dono.
Vejamos alguns exemplo agora:
find /home -name documento.txt
Faz a procura na árvore de diretórios, a partir de /home, arquivos com o nome de documento.txt
find . -name '*.txt'
Faz a procura, partindo do diretório corrente en diante(note o ponto antes do paramêtro -name), todos os arquivos com a extensão txt. É importante observar aqui que o ponto é opcional(caso o ponto seja suprimido, estará subentendido que a busca partirá do diretório atual onde o usuário se localiza, varrendo os sub-diretórios e arquivos desse diretório).
find /tmp -type d -iname '*[0-9]'
Procura no diretório /tmp, por nomes de diretórios (paramero -type d especificando o diretório e iname especificando procura por nomes, não diferenciando maiúsculas de minúsculas), que iniciem por qualquer caractere (asterisco), mas que sejam finalizados por algum número(indicados entre os colchetes, de 0 a 9).
find / -name '*.rpm' -type f -perm 644 -user vitor
Faz a procura iniciando pelo diretório raiz, por nomes de arquivos regulares(-type f) que possuam a extensão .rpm, com permissão 644(leitura e escrita para o dono, leitura para o grupo e para outros) e que pertençam ao usuário vitor.
find /usr -atime -2 -exec ls -l {} \;
find -name "arquivo.doc" -exec rm -fv {} \; ("find ." ou "find " indica que é no diretório corrente)
Procura por arquivos, a partir do diretório /usr, que tenham sido acessados nos últimos dois dias, e à medida em que forem encontrados, lista-os mostrando seus atributos.
find /tmp -type f -atime +2 -delete
Limpa a pasta tmp de arquivos de dois dias.
O comando abaixo exibe arquivos modificados a mais de 7 dias (somente o nome e data)
find ~/ -mtime +7 -printf "%f %AD\n"
melhorando o desempenho do seu Desktop
A pasta ~/.thumbnails guarda miniatura de imagens para agilizar a visualização
mas quando tem muito thumbnail o que era solução passa a ser um problema, para resolver
find ~/.thumbnails -type f -atime +7
xargs rm -fbusca arquivos no path
find ${PATH//:/ } -iname "*admin*" -executable -type f
find ${PATH//:/ } -executable -type f -printf "%f\n" #exibe só o nomeEditar o arquivo mais recentemente criado
vim `find -type f -cmin -10
head -n1`doc ou odt?
find ~/ -iregex ".*\(doc\
odt\)"mais sobre expressões regulares com o find
find . -regextype posix-egrep -iregex '.*/.*teeworlds' -print0
xargs -0 rm -rf Para buscar por vários tipos de imagens
find -regextype posix-extended -regex '.*\.(jpg
png)'localizando arquivos de hoje
find . -type f -ctime -1Uma variação possível - Mostrando de forma detalhada
find . -type f -ctime -1 -lslocalizando arquivos modificados em um intervalo de tempo
find ./ -mtime +6 -mtime -8 -printlocalizando arquivos em um intervalo de tempo
•fonte: command-line-fu
find . -type f -newermt "3 years ago" ! -newermt "2 years ago"combinando o find com o xargs
find . -type f -maxdepth 1 -name '*.ext' -print0
\
xargs -0 comandocopiando estrutura de pastas (somente pastas)
(cd /home/user/source/; find -type d -print0)
xargs -0 mkdir -pAtribuindo propriedade
isto tem que ser feito como root
find ~ ! -user fulano -print0
xargs -0 chown fulano:fulanoOutra opção seria
chown -R fulano.fulano
melhorar desempenho do firefox
find ~ -name '*.sqlite' -exec sqlite3 '{}' 'VACUUM;' \;deletar diretórios vazios
find . -type d -empty -delete
find
adicionando extensão a arquivos
Eu tinha um monte de arquivos sem extensão e queria colocar
no final txt, segue a solução.
find ./ -maxdepth 1 -type f -print0
xargs -0 -i mv ./{} ./{}.txt
Procurando por um padrão no $PATH
find ${PATH//:/ } -iname "*pattern*"
Apagando somente arquivos de um tipo
find ./clipart -type f -iregex '.*\.[^svg]$'
xargs rm -fSe a intenção é apagar apenas
find . -name '*' -print0
xargs -0 rmlocalizando arquivos duplicados usando md5sum
find -type f -exec md5sum '{}' ';'
sort
uniq --all-repeated=separate -w 33
cut -c 35-outra opção
find "$@" -type f -print0
xargs -0 -n1 md5sum
sort --key=1,32
uniq -w 32 -d --all-repeated=separate
1) Find all files.
2) Pipe the filenames to xargs.
3) Which will run md5sum on each filename and pipe the output to sort.
4) Which will sort the output based on the first 32 characters (the checksum) and pipe the output to uniq.
5) Which will find the unique checksums by only looking at the first 32 characters. The options to the uniq command cause it to print each duplicate (and only duplicates) on a separate line.usando alternativas
find -iname *.doc -o -iname *.odt
find -atime +5 \( -name "*.o" -o -name "*.tmp" \)
find + tar
find /home/zago/guiaz -mtime -1 -type f -print
tar jcvf meusarq.tar.bz2 -T -
Localizando arquivos maiores que 3G
find . -type f -size +3G
xargs -I% du -sh %
find + rsync
rsync -avz -e ssh --files-from=<(find -mtime +30 -mtime -60) origem destino
find . -name "whatever.*" -print0
rsync -av --files-from=- --from0 ./ .
copiar arquivos
find /originalPath/ -iname \*.mp3 -print0
xargs -0 -i cp ./{} /destinationPath/
# ou
find . -name '*.mp3' -print0
xargs -i -0 cp {}
outro exemplo
find . -name "*.pdf" -print0
xargs -0 cp -ft downloads/Observe também a opção -u do comando cp que faz com que o cp
copie apenas se o arquivo copiado for mais novo, ou seja, se
no destino houver o mesmo arquivo que está sendo copiado, a cópia
só será efetivada se o arquivo de origem for mais novo.
Arquivos criados a menos de dez minutos e "-and -a" com extensão txt
find ~/ -cmin -10 -a -iname *.txt
find ~/ -size +500M
find ~ -size +10000 -a -iname *.pdf
arquivos com exatamente 1000 caracteres
find . -size 1000c
Arquivos entre 599 e 701 caracteres
find . -size +599c -and -size -701c
Buscando em dois diretórios htdocs e cfi-bin
find htdocs cgi-bin -name "*.cgi" -type f -exec chmod 755 {} ;
Contar quantos txt há em minha pasta pessoal "~/" (combinando com o comando wc)
find ~/ -iname *.txt
wc -l
Mostra todos os arquivos pdf que não sejam maiores que 2000 bytes
tudo que estiver após a exclamação será negado.
find ~/ -iname *.pdf ! -size +2000
Invertendo a lógica do comando acima no primeiro caso tirando a exclamação, no segundo invertendo o sinal de + para menos, veja:
find ~/ -iname *.pdf -size +2000
ou
find ~/ -iname *.pdf ! -size -2000
Procura pdf's de tamanho maiores que 2000 bytes e mostra somente o nome sem o caminho "basename"
find ~/ -iname *.pdf -a -size +2000 -exec basename {} ;
Procurar por arquivos de um usuário especifico
find / -user sergio
find . -user root
Busca com opções. No caso arquivos html ou htm
find ~/ ( -name *.htm -o -name *.html ) -atime +5
find ~/ -iregex '.*html?' -atime +5
**Observações importantes** mudar permissão somente em diretórios "-d"
find . -type d -exec chmod 755 {} ;
Note: chmod -R 755 ./* também aplica a modificação mas também pega arquivos
!!Usando o find com o xargs
Usando o parâmetro -exec ele executa cada vez que acha o arquivo, repassando via pipe "
" para o comando xargs o find faz primeiro as buscas tornando-se mais rápido.
find ~/ -type f -print
xargs rm -rf
find /originalPath/ -iname *.mp3 -print0
xargs -0 -i cp ./{} /destinationPath/
Procure no diretório atual "." arquivos "f" imprima a lista "-print" filtre com o egrep ignorando maiúsculas e minúsculas "i" a "expressao".
find . -type f -print
xargs egrep -i "expressao"
Procurando todos os mp3 e exibindo o espaço ocupado por eles
find . -name \*.mp3 -print0
xargs -0 du -ch
Encontrando arquivos que não contenham extensão .c ou .o
find ~/docs -type f
egrep -v '.[oc]'
Qual a diferenca entre os comandos abaixo?
% find . -user queiroz -exec ls {} ;
% find . -user queiroz -print
xargs ls
A diferenca e que no primeiro find o comando ls e executado uma vez para cada arquivo encontrado. Se forem encontrados 1000 arquivos o comando ls sera executado 1000 vezes.
Ja no segundo exemplo, com a saida do find redirecionada para o comando xargs, o comando ls sera executado sobre um grupo de arquivos de cada vez e nao uma vez para cada arquivo. O que ira determinar o numero de vezes que o comando xargs executara o comando ls e justamente o tamanho da linha de comandos. O comando xargs ira dividir a saida gerada pelo comando find em blocos compativeis com a capacidade do sistema de maneira a que nao ocorra um erro quando da execucao, em nosso caso, do comando ls.
Em outras palavras, suponhamos que o comando find descubra 2000 arquivos sobre os quais o comando xargs devera executar o comando ls. O limite maximo de arquivo sobre os quais o comando ls pode atuare de 500. O comando xargs automaticamente realizara a divisao desta entrada em quatro blocos de 500 arquivos.
Concluindo, o comando xargs e bem mais eficiente do que a diretiva -exec do comando find, por exigir menos recursos computacionais para executar a mesma tarefa. uma vez sobre todos os arquivos encontrados.
Veja o comando abaixo (ainda não testado) procure em /tmp arquivos com tempo de acesso superior a sete dias "-atime +7" e "and" usuário corrente $USER, redirecione através do xargs para o comando de remoção "rm", sem fazer perguntas -f
find /tmp -atime +7 -type f -a -user $USER
xargs rm -rf
find /tmp -atime +7 -type f
xargs rm -f
Procura todos os arquivos suid e setgid executables:
find / ( -perm -4000 -o -perm -2000 ) -type f -exec ls -ldb {} ;
!!Redirecionando o erro padrão "2>/dev/null" para desviar as mensagens
de erro por acesso não root
find / -type f -name dummy 2>/dev/null
!!Parâmetros
-ctime
-mtime
-atime
-cmin
-amin
-mmin
-user
-nouser
-uid
-gruop
-gid
-and ou -a
-or ou -o
-size
-name
-iname
!!Usando ''printf''
O argumento -printf pode receber vários parâmetros
find ~/ -iname *.txt -printf %f\n "\n faz quebra de linha"
These are used the most:
%p imprime o nome do arquivo com o caminho
%m permissions of file, displayed in octal.
%f imprime o nome do arquivo sem o caminho
%g name of the group the file belongs to.
%G gid
%U uid
%h display name of directory file is in, filename isn't included.
%u username of the owner of the file
%c imrprime -ctime
%a tempo de acesso
%m imprime modo de permissão (formato octal)
%A(caractere) - devolve o "atime" (tempo de acesso)
%AD imprime a data tipo dia/mes/ano (data de acesso)
%AH imprime a hora
%AT /hh/mm/ss
%A+ data e tempo separados pro "+"
%Ax mm/dd/aaaa
find ~/ -iname *.txt -printf "%f %Ax %AT \n"
O comando acima exibe arquivos assim:
nome data hora
serii.txt 04-01-2007 12:42:07
%C(caractere) "ctime"
%T(caractere) "mtime"
Um último exemplo
find . -iname *.txt -printf "%p %m %AA %Ad de %AB de %AY %AX\n" isto retorna algo como:
/caminho/leia-me.txt 644 sexta 23 de junho de 2006 10:30:53
Para imprimir o nome do arquivo com o modo de permissão octal use
find ~ -iname *.txt -printf "%p %m\n"
acrescentando o parâmetro %a retorna o ultimo acesso de acordo com "-ctime"
find ~ -iname *.txt -printf "%p %a %m\n"
printf com os parâmetros "%p %m %Ax\n" retorna algo como
/caminho/leia-me.txt 644 23/06/06
printf com os parâmetros "%p %m %g %u %Ax\n" retorna algo como
/caminho/leia-me.txt usuario grupo 644 23/06/06
-printf "%f %u %g %m %Ax %AX\n" veja detalhes abaixo
%f nome sem o caminho
%u usuário
%g grupo
%m modo de permissão
%Ax dada de acesso no modo dd/mm/aa
%AX hora de acesso do tipo 18:15:23
\n quebra de linha
!!Usando Expressões regulares
$ find . -regex './ch0[1-2]_0[1-3].*'
./ch01_01.html
./ch01_02.html
./ch02_01.html
./ch02_02.html
./ch02_03.html
How do I search for files, then do something with the result?
* Find all .conf files, then search through them to see if they contain any IP addresses, then print the filename, line number and the line containing the address
find /etc -name *.conf -exec grep -Hn '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} ;
!Fazendo um backup
tar -zcvf ultimamod.tar.gz `find . -mtime -1 -type f -print`
!Outros exemplos
Localizar todos os arquivos do tipo txt gerados nos últimos 20 minutos, menos os cookies do navegador, que são cosntantemente gerados e não devem ser buscados
find ~/ -iname *.txt -cmin -20
grep -v "cookies"
Usando expressões regulares
find . -regex './ch0[1-2]_0[1-3].*'
./ch01_01.html
./ch01_02.html
./ch02_01.html
./ch02_02.html
./ch02_03.html
Limpando miniaturas de imagens no nautilus
find ~/.thumbnails -type f -atime +7 -exec rm {} ;