
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ábash
instalaçã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 basename
o 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 find
do meu sistema não mostra nenhuma --ignore
opção.
Dito isto, se quiser ignorar qualquer arquivo com a .
no nome, você pode usar find
o 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 sed
comando.
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 ls
em 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