Meu objetivo é enganosamente simples (pelo menos para mim). Desejo pegar a saída de ls -l
ou ls -lh
e selecionar apenas um campo.
Estou procurando que isso seja o mais à prova de balas possível, o que quero dizer, suponha que os nomes de arquivos possam ter um número variável de espaços, nem tudo no campo tem o mesmo comprimento etc.
Pontos de bônus por ter um script que usará o nome do campo (ou mesmo apenas um número de campo) e retornará o conteúdo do campo.
Eu quero virar
para dentro:
command-line
bash
soandos
fonte
fonte
ls
. Ofind
comando é tremendamente útil.ls -l --block-size=M
?ls
comando não é o padrão POSIX, portanto, um script que dependels
pode ser interrompido em diferentes sistemas ou mesmo ao longo do tempo. Veja a resposta de @ormaaj nesta página para mais detalhes. Uma maneira de fazer o que você pede é com um loop Bash. Aqui está um exemplo.for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done
. Obviamente, em vez deecho
, você usaria seu processamento.... | xargs -d '\n' du -m
qual funciona tão bem.-exec
opção defind
.Nunca analise ls . Use GNU
find
. Ou se a portabilidade não for importantestat(1)
,.Para ler dados que não sejam listas de nomes de arquivos linha por linha e dividir em campos, consulte: BashFAQ / 001
Não há métodos para ler com segurança uma lista de nomes de arquivos delimitada por nova linha que faça sentido na maioria das circunstâncias.
fonte
Você pode buscar a coluna específica no shell, como:
ou
awk
como mostrado na resposta do @Corey ,cut -c44-45
também funcionaria após o ajuste (já quels
tem colunas fixas), ou qualquer outra coisa, no entanto, o principal problema é que ele não será confiável e à prova de balas (por exemplo, no Unix, pode ser$6
, não$7
e alterações dependendo dos argumentos), tornando-o não amigável à máquina, portanto , não é recomendável analisar ols
comando .O melhor é usar diferentes comandos disponíveis, como
find
orstat
, que podem fornecer opções relevantes para formatar a saída conforme necessário. Por exemplo:Para retornar a coluna de apenas dias de modificações, tente este exemplo:
Vale ressaltar que o GNU
stat
pode ter opções diferentes para o BSDstat
, por isso ainda não será à prova de balas em diferentes sistemas operacionais.fonte
stat
.date
no entanto, está configurado incorretamente. Você deve adicionar--date=$ymd
, uma vez quedate
, por si só irá imprimir o dia atual, mas o objetivo aqui é converter o formato de data do arquivols -la | cut -c32-33
comando com total honestidade não é totalmente confiável, não apenas por causa das possíveis armadilhas dos nomes de arquivos, mas simplesmente porque depende do comprimento dos nomes de usuários e do tamanho dos arquivos. Ostat -c "%x" *.*
comando parece bem, mas, usando-o,*.*
você o restringe apenas aos nomes de arquivos que contêm um ponto. Eu acho que a intenção era pegar também arquivos ocultos; nesse caso, você deve permitir englobamento para dotfiles antemão e usar*
em vez de*.*
:shopt -s dotglob; stat -c "%x" * | [...]
.--date="$ymd"
aodate
comando, caso contrário ele imprimirá o dia atual do mês.