AWK e nomes de arquivos com espaço.

4

Estou tentando analisar arquivos com o awk para alterar seus nomes. Tudo correu bem até que comecei a fazer isso com arquivos com espaço no nome do arquivo. Os nomes dos arquivos são parecidos com 11237_712312955_2012-01-04 18_31_03.wav e eu quero substituir o wav pelo nome do arquivo. Este é um exemplo do meu código:

ls | awk -F\. '{print $1}'

Depois que eu corri isso no console, tudo está ok e eu recebo o nome do arquivo sem extensão.

Exemplo: arquivo 11237_712312955_2012-01-04 18_31_03.wav

depois ls | awk -F\. '{print $1}' no console que estou recebendo:

11237_712312955_2012-01-04 18_31_03 e isso está correto.

Mas quando coloco isso no meu script:


#!/bin/bash
for i in $(ls);
do
  FILENAME=echo $i | awk -F\. '{print $1}'; #problematic line 
  echo $FILENAME
done

O script está dividindo o arquivo em dois no lugar onde ocorreu o espaço.

A saída do script é: %pr_e%

Como fazer meu script funcionar corretamente?

    
por B14D3 02.04.2012 / 11:19

3 respostas

11

O problema aqui é analisar com ls . Considere dar uma olhada aqui: Por que você não deve analisar a saída de ls .

O motivo pelo qual você não deve fazer isso é porque UNIX permite que quase qualquer caractere em um nome de arquivo, incluindo espaço em branco, novas linhas, vírgulas, símbolos de pipe e praticamente qualquer outra coisa que você tente usar como delimitador, exceto NUL. . Em seu modo padrão, se a saída padrão não for um terminal, ls separará nomes de arquivos por novas linhas. Isso é bom até que você tenha um arquivo com uma nova linha em seu nome.

    
por 02.04.2012 / 11:27
7

Oh meu deus, isso é horrível.

Seu script usa o bash; Eu sugiro que você faça isso:

#!/bin/bash
for i in *.wav; do mv "${i}" "${i%.wav}.ext"; done

Consulte o Guia do Bash para obter mais detalhes sobre a expansão de parâmetros.

    
por 02.04.2012 / 11:25
0

Você poderia tentar isso.

awk '{print substr($0, index($0,$9))}'

Por exemplo, esta é a saída do comando ls:

-rw-r - r--. 1 raiz do root 73834496 6 de dezembro 10:55 Arquivo com espaços 2

Se você usar um awk simples como este

# awk '{print $9}'

Retorna apenas

# File

Se usado com o comando completo

# awk '{print substr($0, index($0,$9))}'

Eu recebo toda a saída

Arquivo com espaços 2

Aqui substr (s, a, b): retorna b número de caracteres da string s, começando na posição a. O parâmetro b é opcional.

Por exemplo, se a correspondência for addr: 192.168.1.133 e você usar substr da seguinte forma

# awk '{print substr($2,6)}'

Você obtém o IP, por exemplo, 192.168.1.133. Observe o 6 é o caractere a partir de um em addr

Então, no comando apropriado, o $ 2 é $ 0 (que imprime linha inteira.) e índice ($ 0, $ 9) corresponde a $ 9 e imprime tudo à frente da coluna 9. Você pode alterar isso para índice ($ 0, $ 8) e ver isso a saída muda para

# 10:55 File with spaces 2

'index (IN, FIND)'      Isso pesquisa a string IN para a primeira ocorrência da string      FIND, e retorna a posição em caracteres onde essa ocorrência      começa na string IN.

Espero que ajude. Além disso, se você estiver atribuindo esse valor a uma variável no script, será necessário incluir as variáveis entre aspas duplas. Caso contrário, você receberá erros se estiver fazendo alguma outra operação para o nome do arquivo extraído.

    
por 06.12.2016 / 08:01

Tags