comando linux find para nomes de arquivos sem extensão para extensões desconhecidas

comando linux find para nomes de arquivos sem extensão para extensões desconhecidas

Gosto de usar o seguinte comando para imprimir nomes de arquivos, mas ele os imprime com extensões.

find . -type f -printf '%f\n'

No meu diretório, existem muitos arquivos com extensões diferentes. Tentei adicionar --ignore='*.*'antes e depois -printf, mas não funcionou. exemplo; Tenho os arquivos meuarquivo1.txt, meuarquivo2.mp3, etc. Preciso que ele imprima meuarquivo1, meuarquivo2, etc.

Responder1

Se bem entendi (Eu não, veja a segunda parte da resposta), evite listar nomes de arquivos que contenham um caractere de ponto.

Isso fará isso:

find . -type f ! -name '*.*'

O padrão globbing do nome do arquivo *.*corresponderia a qualquer nome de arquivo contendo pelo menos um ponto. O anterior !nega o sentido da correspondência, o que significa que os nomes dos caminhos que chegam ao final serão aqueles de arquivos que não possuem pontos em seus nomes. Emrealmente antigoshells, você pode querer escapar do !as \!(ou atualizar sua instalação do Unix). O solitário !não invocarábashinstalação de expansão da história.

Para imprimir apenas o componente do nome do arquivo do caminho encontrado, com GNU find:

find . -type f ! -name '*.*' -printf '%f\n'

Com padrão find(ou GNU find):

find . -type f ! -name '*.*' -exec basename {} \;

Antes de usar isso em uma substituição de comando em um loop, consulte "Por que fazer um loop na saída do find é uma prática ruim?".


Para listar todos os nomes de arquivos e ao mesmo tempo remover tudo após o último ponto do nome ("remover a extensão"), você pode usar

find . -type f -exec sh -c '
    for pathname do
        pathname=$( basename "$pathname" )
        printf "%s\n" "${pathname%.*}"
    done' sh {} +

Isso enviaria todos os nomes de caminho encontrados de todos os arquivos para um curto loop de shell. O loop pegaria cada nome de caminho e basenameo chamaria para extrair o componente do nome do arquivo do nome do caminho e, em seguida, imprimiria a string resultante com tudo após o último ponto removido.

A expansão do parâmetro ${pathname%.*}significa "remover a correspondência de string mais curta .*(um ponto literal seguido por texto arbitrário) do final do valor de $pathname". Isso teria o efeito de remover um sufixo de nome de arquivo após o último ponto no nome do arquivo.

Para obter mais informações sobre find ... -exec ... {} +, consulte, por exemplo, "Compreendendo a opção -exec de `find`".

Responder2

No Linux, não existe extensão de arquivo. A .em um nome de arquivo não tem nenhum significado (apesar de a .como oprimeirocaractere em um nome de arquivo o identifica como um arquivo oculto).

Além disso, verificar a página de manual finddo meu sistema não mostra nenhuma --ignoreopção.

Dito isto, se quiser ignorar qualquer arquivo com a .no nome, você pode usar findo operador ' -not:

find -type f -not -name '*.*' -print

Responder3

Como outros apontaram, "extensões" realmente não significam nada para os sistemas Unix. Mas podemos removê-los de uma listagem com um simples sedcomando.

por exemplo

find * -type f -print | sed 's/\.[^.]*$//'

Se houver diretórios e você não quiser que eles sejam mostrados na listagem, então

find * -type f -printf "%f\n" | sed 's/\.[^.]*$//'

Para um único diretório, podemos apenas usar lsem vez defind

ls | sed 's/\.[^.]*$//'

Responder4

tentar

find . -type f \! -name '*.*' -print

onde

  • \!: não (! deve ser escapado)
  • name '*.*': nome do arquivo com extensão

informação relacionada