Como eu seleciono um campo / coluna da saída de 'ls -l'?

17

Meu objetivo é enganadoramente simples (pelo menos para mim). Desejo retirar a saída de ls -l ou ls -lh e selecionar apenas um campo.

Eu estou procurando que isso seja o mais à prova de balas, o que significa que os nomes dos arquivos podem ter um número variável de espaços, nem tudo no campo tem o mesmo tamanho, etc.

Pontos de bônus por ter um script que levará o nome do campo (ou mesmo apenas um número de campo) e, em seguida, retornará o conteúdo do campo.

Eu quero virar

para:

    
por soandos 10.07.2012 / 03:00

3 respostas

32

Experimente ls -l | awk '{print }' .

awk seleciona colunas, por isso é perfeito para essa tarefa.

    
por Corey Whitaker 10.07.2012 / 03:04
16

Nunca analise ls . Use o GNU find . Ou se a portabilidade não for importante, stat(1) .

find . -maxdepth 1 -printf '%Td\n'

Para ler dados que não sejam listas de nomes de arquivos linha a linha e dividir em campos, consulte: BashFAQ / 001

Não há métodos para ler de forma confiável uma lista delimitada por novas linhas de nomes de arquivos que fazem sentido na maioria das circunstâncias.

    
por ormaaj 10.07.2012 / 03:15
1

Você pode buscar a coluna específica no shell como:

ls -al | while read perm bsize user group size month day time file; do echo $day; done

ou awk como mostrado em @Corey answer , cut -c44-45 também funcionaria após o ajuste (desde ls tem colunas fixas), ou qualquer outra coisa, mas o problema principal é que não será confiável e à prova de balas (por exemplo, no Unix pode ser , não , e muda dependendo dos argumentos) portanto, é conveniente para máquinas não é recomendado analisar o comando ls .

O melhor é usar diferentes comandos disponíveis, como find ou stat , que podem fornecer opções relevantes para formatar a saída conforme necessário. Por exemplo:

$ stat -c "%x %n" *
2016-04-10 04:53:07.000000000 +0100 001.txt
2016-04-10 05:08:42.000000000 +0100 7c1c.txt

Para retornar a coluna de apenas alguns dias de modificações, tente este exemplo:

stat -c "%x" * | while read ymd; do date --date="$ymd" "+%d"; done

Vale a pena notar que o GNU stat poderia ter opções diferentes para o BSD stat , por isso ainda não será à prova de bala em diferentes sistemas operacionais.

    
por kenorb 10.04.2016 / 06:27