Estou procurando extensões de arquivos e cut simplesmente dá o nome do arquivo se o arquivo não tiver extensão, então estou procurando fazer cut dar um "sem extensão" quando não houver '.' for encontrado, estou usando isso como referência: https://stackoverflow.com/questions/1842254/how-can-i-find-all-of-the-distinct-file-extensions-in-a-folder-hierarchy o respostas que ignoram os arquivos sem extensões não eram boas, pois eu precisava encontrá-las também
relate perguntas
-
"Nenhum arquivo ou diretório" ao usar "-exec" com find
-
Corte as duas primeiras linhas
-
Corte e substitua uma coluna específica de uma lista de arquivos
-
sort Descubra quantos valores distintos existem em determinada coluna
-
Existe uma alternativa de substituição/expansão de parâmetro para "| cut -f1,2,3 -d:" também conhecido como trim após e incluindo a n-ésima ocorrência de caractere?
Na
zsh
casca:Isso imprime todas as extensões de todos os arquivos regulares dentro ou sob o diretório atual em uma linha cada. A extensão vazia é substituída pelo texto
EXTENSIONLESS
usandosed
antes de serem classificados e contados.O
**
glob inzsh
corresponde/
em nomes de caminho ("recursivamente"), assim como o mesmo padrãobash
quando aglobstar
opção de shell é definida nesse shell.O
(.:e)
no final do padrão é um qualificador globbing que faz com que o padrão anterior corresponda apenas a arquivos regulares(.)
e remove tudo, exceto a extensão, de cada nome correspondente (:e
).A mesma coisa, mas substituindo nomes de arquivos sem extensão
dummy.EXTENSIONLESS
dentro da expressão globbing usando umae['...']
expressão e, portanto, se livrando dased
chamada:Em um não-
zsh
shell, você pode usarfind
um script de shell in-line para fazer as primeiras partes do pipeline acima:Isso é usado
find
para encontrar todos os arquivos regulares dentro ou abaixo do diretório atual. Para lotes desses arquivos, ele chama um script de shell em linha. O script itera sobre o conjunto atual de nomes de caminho e extrai a parte do nome de arquivo de cada um na variávelname
. Em seguida, ele testa se$name
contém um ponto seguido por pelo menos um outro caractere. Se houver um ponto (seguido de algo) no nome, a parte após o ponto é impressa; caso contrário, a stringEXTENTSIONLESS
é impressa.A saída de
find
é então classificada e contada da mesma maneira que antes.Observe que o código acima chamaria um nome como
hello.
extension-less, enquanto.bashrc
teria a extensãobashrc
. Altere o padrão*.?*
para*?.?*
exigir um caractere em ambos os lados do ponto (faria.bashrc
contar como sem extensão).