Comando “find” do Terminal Mac: O que significa uma barra dupla na saída do resultado?

9

Eu uso o comando find para pesquisar em estruturas de diretório grandes e aninhadas.

No resultado, a saída às vezes inclui uma barra dupla (//).

Exemplo (depois de "Downloads"):

#> find ~/Downloads/ -iregex ".*some.*"
/Users/michael/Downloads//subDirectory/some_file.pdf

Eu primeiro pensei que marcaria o diretório de trabalho atual. Mas esse não é o caso.

Qual é o significado dessa barra dupla?

Normalmente copio o resultado para a área de transferência, mudo para o localizador. Em seguida, "shift" + "command" + "g" e colando o caminho (até o arquivo) na caixa. Para que o diretório contendo seja aberto.

Funciona bem. Mas a barra dupla eu tenho que remover manualmente.

Portanto: como posso evitá-lo?

mizech
fonte
2
Observe que você não precisa remover a barra dupla. Uma barra dupla é especial apenas no início de um caminho e somente se forem exatamente duas barras. Várias barras no meio ou no final ou qualquer número de barras do que exatamente duas no início são exatamente equivalentes a uma barra. Isso é garantido pela especificação POSIX / SUS.
Jörg W Mittag

Respostas:

17

findé bastante literal. Quando você diz para procurar em "~ / Downloads /", ele usa isso (incluindo a barra final) como o prefixo para o que quer que encontre. Como existe uma barra desnecessária e irrelevante no final do caminho que você deu, você acaba com uma barra extra desnecessária e irrelevante na saída.

Solução: remova o "/" à direita do diretório de pesquisa:

#> find ~/Downloads/ -iregex ".*some.*"
/Users/michael/Downloads//subDirectory/some_file.pdf
#> find ~/Downloads -iregex ".*some.*"
/Users/michael/Downloads/subDirectory/some_file.pdf
Gordon Davisson
fonte
4

Qual é o significado dessa barra dupla?

Significa que você está usando uma descoberta BSD antiga e estranha.

Como posso evitá-lo?

Você pode realmente omitir a barra final no seu comando original, mas desde que ela seja adicionada automaticamente por meio da conclusão da guia (da qual você definitivamente deve usar o máximo possível), e como a barra final é realmente usada em vários lugares para garantir que você está lidando com um diretório e não um nome de arquivo, omitir é contra-intuitivo e bobo.

Em vez disso, sugiro fazer uma dessas outras coisas:

a) Faça um invólucro para encontrar os tubos para sed: | sed @ // @ / @ '

b) Instale o findutils do GNU com 'brew install findutils' e use 'gfind' diretamente, alias 'find' para 'gfind' ou adicione / usr / local / opt / findutils / libexec / gnubin ao seu caminho (o que também adiciona GNU findutils '' localizar ',' updatedb 'e' xargs ').

c) Alterne para um sistema operacional GNU / Linux adequado que não tivesse esse problema (e milhares de outros) em primeiro lugar. : p

Jan Kyu Peblik
fonte
1
Basta adicionar set mark-directories offao seu. inputrce você está pronto para ir. De um daqueles caras antigos do BSD.
fd0
@ fd0, então não seria possível distinguir entre diretórios e arquivos com o mesmo nome; é achado do BSD que é um pouco intrincada aqui, não bash ou readline
Jan Kyu Peblik