Eu 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 arquivos myfile1.txt, myfile2.mp3, etc. Preciso que imprima myfile1, myfile2, etc. Como eu faria isso?
Se eu entendi corretamente ( não entendi, veja a segunda parte da resposta ), você deseja evitar listar nomes de arquivos que contenham um caractere de ponto.
Isso fará isso:
O padrão de globbing de nome de arquivo
*.*
corresponderia a qualquer nome de arquivo contendo pelo menos um ponto. O precedente!
nega o sentido da correspondência, o que significa que os nomes de caminho que chegam até o final serão os de arquivos que não têm pontos em seus nomes. Em shells realmente antigos , você pode querer escapar do!
as\!
(ou atualizar sua instalação do Unix). O solitário!
não invocarábash
o recurso de expansão do histórico .Para imprimir apenas o componente de nome de arquivo do nome de caminho encontrado, com GNU
find
:Com padrão
find
(ou GNUfind
para esse assunto):Antes de usar isso em uma substituição de comando em um loop, consulte " Por que o loop sobre a saída de 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
Isso enviaria todos os nomes de caminho encontrados de todos os arquivos para um loop de shell curto. O loop pegaria cada nome de caminho e o chamaria
basename
para extrair o componente de nome de arquivo do nome de 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 um 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 de arquivo.Para mais informações sobre
find ... -exec ... {} +
, veja por exemplo " Entendendo a opção -exec de `find` ".No Linux, não existe extensão de arquivo. A
.
em um nome de arquivo não tem nenhum significado (apesar de que a.
como o primeiro caractere em um nome de arquivo o identifica como um arquivo oculto).Além disso, verificar a página de manual
find
no meu sistema não mostra nenhuma--ignore
opção.Dito isto, se você quiser ignorar qualquer arquivo com um
.
em seu nome, você pode usarfind
o-not
operador :Como outros apontaram, "extensões" não significam nada para sistemas Unix. Mas podemos removê-los de uma lista com um simples
sed
comando.por exemplo
Se houver diretórios e você não quiser que eles sejam exibidos na listagem,
Para um único diretório, podemos usar
ls
em vez defind
tentar
Onde
\!
: não (! deve ser escapado)name '*.*'
: nome do arquivo com extensão