Como localizo um arquivo por nome de arquivo no terminal Mac OSX?


118

Quero encontrar um arquivo no meu Macbook com o filename: abc.dmg. Eu tentei usar o foco, mas ele não o encontra. Quando tentei encontrar e usei find -name abc.dmg -path /:, recebi erros de volta.

Qual é a sintaxe adequada para encontrar um arquivo por nome de arquivo com o comando find em um terminal Mac OSX?


1
@VxJasonxV As perguntas da Apple são 100% sobre o tópico Superusuário, e não há necessidade real de que todas as perguntas da Apple sejam movidas para lá. As perguntas do iPhone ou iPad, no entanto, serão movidas quando / se necessário.
BinaryMisfit

Não era tanto uma razão para estar fora do tópico, mas o fato de haver um tópico / site mais específico para esse assunto geral.
VxJasonxV

@Diago: Houve alguma discussão sobre isso no meta ou no chat? Estou imaginando porque o AFAIK apple.SE estará lançando a versão beta em breve, então seria bom colocar todos na mesma página.
Robert S Ciaccio

1
@calavera. Discussões bastante antigas, mas relevantes, podem ser encontradas aqui . O Apple SE, o Ubuntu SE e o Linux SE estão lá para complementar o Superusuário, mas de forma alguma queremos forçar os usuários a se mudarem. Eu prefiro fazer minhas perguntas da Apple aqui do que da Apple, já que eu uso três sistemas operacionais diferentes. Se eu tiver uma pergunta muito específica, eu a perguntarei em um site mais especializado.
BinaryMisfit

Respostas:


163

Na sua forma mais simples, findassume um parâmetro: o caminho. Na sua forma realmente útil, segue o caminho seguido por critérios de restrição.

Assim, você deseja:

  • find (o programa)
  • / (o caminho) e
  • -name abc.dmg (o critério).
find / -name abc.dmg

12
Você pode obter erros de tipo de permissão negada ao pesquisar a unidade inteira, mas eles podem ser ignorados, a menos que você espere que o arquivo esteja em uma pasta restrita. Em caso afirmativo, use sudo find / -name abc.dmg
Chris Nava

Tentei, mas sem resultado.
SPRBRN

6
Presumivelmente, você não tem um arquivo chamado abc.dmg no seu computador. Você pode usar -iname em vez de -name para tornar a pesquisa insensitiva. Duvido muito que você esteja realmente procurando por "abc.dmg" e, considerando esse fato (presumivelmente), é difícil dizer qual é o seu problema sem ter os detalhes reais.
VxJasonxV

2
@rxt: se encontrar não encontrar, ele não está lá ...
Robert S Ciaccio

5
Dado que o relatório do OP tentou encontrar no texto da pergunta, vale a pena notar que a ordem dos argumentos é find importante . Se deve ser find [path]+ [selection, grouping, and actions].
dmckee

23

find . -name '*.csv'por exemplo, trabalhou para mim com caracteres curinga. OP também pode usar find . -name '*.dmg'para verificar seu diretório atual, assumindo que ele estava em /.



6

Você pode usar o locatecomando

locate abc.dmg

2
Observe a osxetiqueta. slocate db não é preenchido por padrão.
VxJasonxV

Tentei, depois de criar o banco de dados, mas sem resultado.
SPRBRN

se locatee mdfindambos falharem, é provável que o arquivo não esteja na sua máquina. Ou não é nomeado como você acha que é nomeado. talvez procurar TODOS os DMGs possa ser seu próximo passo?
peelman

3

A maneira mais simples (que eu tenho certeza que você já tentou, mas, deixe-me adicioná-lo à discussão de qualquer maneira) é inserir abc.dmg na caixa de pesquisa no canto superior direito de qualquer janela do localizador e selecione "Arquivo Nome "nas opções na barra de pesquisa que aparece.

Não há necessidade do terminal.

Lembre-se também de que o Spotlight indexa apenas os diretórios especificados no painel de controle do Spotlight e o abc.dmg pode não estar em um desses diretórios.

Corrija-me se estiver errado, mas acho que o comando find precisa saber o que gerar:

find / -name abc.dmg -print

... deve imprimir qualquer resultado no terminal (incluindo erros de permissão).

Se você não deseja erros de permissão e deseja pesquisar em outros diretórios de usuários, então:

sudo find / -name abc.dmg -print

2

Você pode usar as seguintes funções da linha de comando para localizar e abrir rapidamente o arquivo relevante. Acho isso mais fácil do que digitar uma longa sequência de consultas na janela do Spotlight.

Adicione as seguintes funções em ~/.bash_aliases.

# find any item matching search query in file name
spot(){
  mdfind "kMDItemDisplayName=='*$1*'cd";
}

# restrict to files under (recursive) a specific path 
findpaper(){
    mdfind -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd";
}

# default to open the first entry unless 2nd positional argument is given
openpaper(){
    FILEID=$(printf "%sp" ${2:-1})

    open "$(mdfind -name -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd" | sed -n "${FILEID}")"

}

Agora, source ~/.bash_aliasesabra ou abra uma nova função de carregamento de terminal. Para procurar arquivos com palavras, pizza e 2016 em qualquer lugar no nome do arquivo, faça

spot pie*2016 #or
spot 2016*pie

Não há necessidade de anexar ou anexar *à sua consulta como padrão de pesquisa, '*$1*'já identifica a entrada de curinga no início e no final da consulta. Adicional cdé para não freddiferenciar maiúsculas de minúsculas e ignorar marcas diacríticas, por exemplo, retornará Frédéric e FrEDeric.

findpaperrestringirá a pesquisa aos resultados em um caminho específico (recursivo) enquanto openpaper pie*201abrirá um (ou primeiro de vários resultados) resultado da pesquisa ou openpaper pie*201 3abrirá a entrada do terceiro resultado. Para evitar a abertura de scripts bash ou outros arquivos não documentais, você pode restringir o conteúdo do arquivo por atributos de pesquisa adicionais. Consulte Sintaxe de expressão de consulta de metadados de arquivo e https://ss64.com/osx/mdfind.html para usar outros operadores de pesquisa.


Impressionante! Stilling it: D
Atcold 15/07

0

Capture uma lista de todos os arquivos no seu disco como root em /

sudo find / &> ~/file-list.txt
sudo chown $(whoami) ~/file-list.txt

Coloque o arquivo inteiro no grep para pesquisar a unidade inteira:

cat ~/file-list.txt | grep abc.dmg

Use expressões regulares para mostrar apenas arquivos .jpg e .dmg:

cat ~/file-list.txt | grep -E "(\.dmg|\.jpg)"

Resultado:

Applications/Visualisations/CurvedSpaces-forMac.app/Contents/Resources/Textures/paper.jpg

... etc Infelizmente, também capturamos todos os discos montados, para melhor ejetar aqueles do Time Machine, pois eles têm muitos links. Então, em outra janela, corro, o watch tail -n 10 ~/file-list.txtque mostra onde está o meu truque covarde!


1
Más práticas ou coisas que merecem algum comentário: (1) sudo find / > ~/file-list.txtparece melhor do que executar todo o shell como root. (2) find *pulará objetos ocultos (pontos) (se houver) em /. (3) &>é um basismo. (4) Uso inútil de cat. (5) grep abc.dmgimprimirá, por exemplo /foo/bar/123abcXdmg456/baz/whatever. // Uma coisa boa que sua resposta traz para esse segmento (e a outra resposta não) é a abordagem em que o usuário executa finduma vez e depois reutiliza o resultado salvo várias vezes sem consultar o (s) sistema (s) de arquivos repetidamente. Essa vantagem potencial não é acentuada.
Kamil Maciorowski

bom ponto, graças Kamil, fez isso e também chown $ (whoami)
Tomachi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.