O que há de errado com o código a seguir?
name='$filename | cut -f1 -d'.''
Como é, recebo a string literal $filename | cut -f1 -d'.'
, mas se removo as aspas, não recebo nada. Enquanto isso, digitando
"test.exe" | cut -f1 -d'.'
em uma concha me dá a saída que eu quero test
,. Eu já sei $filename
que foi atribuído o valor certo. O que eu quero fazer é atribuir a uma variável o nome do arquivo sem a extensão.
basename $filename .exe
faria a mesma coisa. Supondo que você sempre saiba qual extensão deseja remover.basename "$filename" .exe
. Caso contrário, os nomes de arquivos com espaços seriam más notícias.Respostas:
Você deve usar a sintaxe de substituição de comando
$(command)
quando desejar executar um comando em script / comando.Então sua linha seria
Explicação do código:
echo
obter o valor da variável$filename
e enviá-lo para a saída padrãocut
comandocut
usará o. como delimitador (também conhecido como separador) para cortar a sequência em segmentos e-f
selecionamos qual segmento queremos ter na saída$()
substituição do comando obterá a saída e retornará seu valorname
Observe que isso fornece a parte da variável até o primeiro período
.
:fonte
echo $filename | cut -f1 -d'.'
$()
é o preferido.Você também pode usar a expansão de parâmetros:
fonte
echo -n "This.File.Has.Periods.In.It.txt" | awk -F. '{$NF=""; print $0}' | tr ' ' '.' | rev | cut -c 2- | rev
. Obrigado.image.png.gz
?%.*
removerá apenas a última extensão; se você deseja remover todas as extensões, use%%.*
.Se você conhece a extensão, pode usar o nome da base
fonte
.wiki
e acabar com/home/jsmith/base
?Se o seu nome de arquivo contiver um ponto (que não seja o da extensão), use este:
fonte
-s
opção dadacut
, para que ele retorne uma string vazia sempre que o nome do arquivo não contiver pontos.use o que quiser. Aqui, suponho que o último
.
(ponto) seguido pelo texto seja extensão.fonte
saídas:
Observe que apenas a última extensão é removida.
fonte
Minha recomendação é usar
basename
.É por padrão no Ubuntu, código visualmente simples e lida com a maioria dos casos.
Aqui estão alguns sub-casos para lidar com espaços e multi-pontos / sub-extensões:
Geralmente ele se livra da extensão desde o início
.
, mas falha em nosso..
caminhoAqui está uma nota importante:
No entanto, você ainda precisa pensar em
.hidden_files
não é o resultado "" esperado. Para que isso aconteça, use
$HOME
ou/home/user_path/
porque novamente o bash é "incomum" e não expanda "~" (pesquise bash BitPitfalls)
fonte
saídas:
fonte
Como apontado por Hawker65 no comentário da resposta do chepner, a solução mais votada não cuida de várias extensões (como filename.tar.gz), nem de pontos no restante do caminho (como this.path / with .dots / in.path.name). Uma solução possível é:
fonte
Dois problemas com seu código:
Eu mudaria seu código para "name =` echo $ filename | cut -f 1 -d '.' `", como mostrado abaixo (novamente, observe as marcações em volta da definição da variável de nome):
fonte