Lista informações sobre arquivos / diretórios com espaços

1

Estou tentando usar o ls para obter informações sobre arquivos e diretórios. Meu comando atual falha ao obter corretamente o nome sempre que um arquivo / diretório tiver um espaço.

Estou usando isso para listar todos os arquivos / diretórios em um diretório:

ls -al --time-style=+%s . | awk '{if ($7 != ".." && $7 != "." && $1 != "total") print $1"\t"$3"\t"$5"\t"$6"\t"$7}'

Digamos que eu tenha 3 diretórios em meu pwd "no-spaces-dir", "algum diretório", "algum outro diretório", essa seria a saída:

drwxr-xr-x.     testuser    4096    1349853378      no-space-dir
drwxr-xr-x.     testuser    4096    1349853387      some
drwxr-xr-x.     testuser    4096    1349853359      two

Eu vou dizer que isso é um problema com a minha parte awk. Então $ 7 deve ser o nome do diretório, e obviamente eu poderia adicionar $ 8 e $ 9 para obter o resultado desejado para o exemplo que eu configurei, mas eu nem sempre sei que um diretório só tem 1 ou 2 espaços ..

Como posso manter esta outra informação presente (permissões de arquivo / diretório, usuário, espaço, timestamp) e também obter o nome completo na saída do comando?

    
por Rich 10.10.2012 / 09:23

2 respostas

4

O problema é que o awk está analisando a entrada com espaços em branco como separadores de campo. Isso cria problemas quando você tem espaços em branco como parte de um campo.

Em vez de analisar a saída de ls , você pode usar stat(1) para obter o que deseja, junto com a opção de shell bash "dotglob".

shopt -s dotglob  # Enable * to match files starting with a dot
stat -c $'%A\t%U\t%s\t%Y\t%n' *

A string de formatação exibe os campos desejados no formato desejado. O uso de $ '...' permite que o \ t seja expandido para uma aba. Você poderia inserir um caractere de tabulação real e soltar o $ inicial se você quisesse.

Leia a página bash(1) man para detalhes sobre o dotglob e preste atenção no GLOBIGNORE. Leia a página stat(1) man para o que você pode colocar em uma string de formato.

    
por 10.10.2012 / 09:42
1

Como já foi mencionado, analisar ls não é a melhor maneira de imprimir o conteúdo do diretório. Você problema pode ser facilmente resolvido, no entanto.

Como o nome do arquivo / diretório é sempre a última coluna (ou colunas), em vez de imprimir $ 7, você pode imprimir de $ 7 até a última coluna. Você pode fazer isso com:

substr($0, index($0, $7))

Então, seu comando completo seria:

ls -al --time-style=+%s . | awk '{if ($7 != ".." && $7 != "." && $1 != "total") print $1"\t"$3"\t"$5"\t"$6"\t" substr($0,index($0,$7));}'

Observe também que verificar se $1 != "total" não é uma boa ideia, uma vez que não funcionará em sistemas localizados (onde total pode ser outra palavra). Sugiro usar NF>6 para garantir que você tenha colunas suficientes.

    
por 10.10.2012 / 09:57