Estou escrevendo um script de construção noturno no bash.
Tudo está bem e elegante, exceto por um pequeno obstáculo:
#!/bin/bash
for file in "$PATH_TO_SOMEWHERE"; do
if [ -d $file ]
then
# do something directory-ish
else
if [ "$file" == "*.txt" ] # this is the snag
then
# do something txt-ish
fi
fi
done;
Meu problema é determinar a extensão do arquivo e agir em conformidade. Eu sei que o problema está na instrução if, testando um arquivo txt.
Como posso determinar se um arquivo tem um sufixo .txt?
$(dirname $PATH_TO_SOMEWHERE)
e$(basename $PATH_TO_SOMEWHERE)
se dividir em pasta e diretório e fazer algo diretório-ish e arquivo-ishRespostas:
Eu acho que você quer dizer "Os quatro últimos caracteres de $ file são iguais
.txt
?" Nesse caso, você pode usar o seguinte:Observe que o espaço entre
file:
e-4
é necessário, pois o modificador ': -' significa algo diferente.fonte
${var:-4}
não é o mesmo que${var: -4}
; o primeiro (sem espaço) será expandido como '-4' se var estiver desativado; o segundo (com espaço) retornará os últimos 4 caracteres de var.if [ "${file: -4}" == ".txt" ]
vez disso.Faço
como isso:
Ou seja, colchetes duplos e sem aspas.
O lado direito
==
é um padrão de concha. Se você precisar de uma expressão regular, use-o=~
então.fonte
if
declaração multi-condicional . Estou compartilhando aqui, caso ajude alguém.if [[ ( $file == *.csv ) || ( $file == *.png ) ]]
if [[ $file =~ .*\.(csv|png) ]]
. É mais curto, mais claro, mais fácil de adicionar extensões adicionais e pode ser facilmente configurável (colocando "csv | png" em uma variável).if [[ "$file" == *.txt ]]
Se o arquivo tiver espaços em seu nome, serão necessárias aspas duplas.Você simplesmente não pode ter certeza em um sistema Unix, que um arquivo .txt é realmente um arquivo de texto. Sua melhor aposta é usar "arquivo". Talvez tente usar:
Em seguida, você pode usar uma lista de tipos MIME para comparar ou analisar a primeira parte do MIME, onde você obtém itens como "texto", "aplicativo" etc.
fonte
file -i...
inclui a codificação MIME, você pode usarfile --mime-type -b ...
Você pode usar o comando "arquivo" se realmente deseja descobrir informações sobre o arquivo, em vez de confiar nas extensões.
Se você se sentir confortável em usar a extensão, poderá usar o grep para verificar se ela corresponde.
fonte
file
comando. Na verdade, eu tentei fazer a correspondência com base na saída do referido comando ... mas falhei horrivelmente nessas declarações if.Você também pode fazer:
fonte
case $FILE in *.txt ) ... ;; esac
pareceria mais robusto e idiomático.Semelhante ao 'arquivo', use o 'mimetype -b', um pouco mais simples, que funcionará independentemente da extensão do arquivo.
Edit: você pode precisar instalar o libfile-mimeinfo-perl no seu sistema se o tipo de tipo não estiver disponível
fonte
A resposta correta sobre como disponibilizar a extensão em um nome de arquivo no linux é:
Exemplo de impressão de todas as extensões de arquivo em um diretório
fonte
Escrevi um script bash que analisa o tipo de arquivo e depois o copia para um local. Utilizo-o para examinar os vídeos que assisti online do meu cache do Firefox:
Ele usa idéias semelhantes às apresentadas aqui, espero que isso seja útil para alguém.
fonte
Eu acho que
'$PATH_TO_SOMEWHERE'
é algo assim'<directory>/*'
.Nesse caso, eu mudaria o código para:
Se você quiser fazer algo mais complicado com o diretório e os nomes dos arquivos de texto, poderá:
Se você tiver espaços nos nomes dos arquivos, poderá:
fonte
for
ewhile
loops para quando o corpo do loop precisar ser mais complexo.