Resultados inconsistentes usando o corte na saída de ls

1

Eu estou lutando para entender por que recebo saída diferente do mesmo comando executado em um único arquivo no Terminal (Mac OS X 10.6.8) e executado em mais de um arquivo. Como desejo executar o comando em um script bash, estou tentando obter resultados consistentes quando executado em um arquivo de cada vez.

O comando me dando o problema

ls -l "filename" | cut -f8 -d' '

Estou tentando isolar o tamanho do arquivo.

Parece que isso funciona para arquivos sem permissões estendidas (por exemplo, um primeiro campo de "-rw-r - r--"), mas para aqueles com permissões estendidas (por exemplo, um primeiro campo de "-rwxrwxrwx @") eu preciso corte -f7 -d ''

Curiosamente, se eu escolher um arquivo de cada tipo e executar:

ls -l "filename1" "filename2" | cut -f8 -d' '

retorna o tamanho do arquivo para ambos arquivos sem problema. Eu não entendo porque isso deveria acontecer ... mas é claro que no meu script eu estou fazendo esse arquivo de cada vez.

Eu tentei usar o sed para remover o espaço em branco duplicado e as guias duplicadas, o que altera o número do campo necessário para fornecer o tamanho do arquivo, mas ainda parece fornecer resultados que dependem de suas permissões de arquivo estendidas ou não. / p>

Estou incluindo o loop while do meu script para referência, mas ele não é lido com facilidade porque o tamanho do arquivo é apenas um dos 4 campos separados por dois pontos que estou inserindo.

#!/bin/bash

# lots of other stuff here including specifying input (which is a list of filenames with complete paths) and output files  ...

while IFS= read -r line
do
    echo "$line":'exiftool -all= -o - "$line" | md5':'md5 "$line" | cut -f2 -d'=' | sed -e 's/^[ \t]*//'':'ls -l "$line" | cut -f8 -d' '' >> "$outputfile"
done < "$file"

Alguém pode ajudar a esclarecer isso para mim?

    
por yvf5rcuya4 11.04.2013 / 08:02

1 resposta

1

O verdadeiro problema é que você está tentando analisar a saída de ls . Isso nunca é uma boa idéia, e como você observou, pode quebrar facilmente. Por uma vez, não é nem portátil nos sistemas operacionais. Analisar ls é muitas vezes um sintoma de necessidade de fazer outra coisa, mas de contornar (e isso é um Problema XY ).

De qualquer forma, você está perguntando:

I am trying to isolate the file size.

Em seguida, basta usar wc -c :

wc -c < filename

Isto lhe dará o tamanho do arquivo em bytes (ao contrário de du , o que lhe dá blocos). Você pode cortar o espaço em branco canalizando para tr -d ' ' ou similar.

Como uma pequena dica para o seu loop: Em vez de usar backticks para realizar a substituição de comandos, faça um favor e use $() , por exemplo. %código%. Isso tem várias vantagens, incluindo maior legibilidade e menos dores de cabeça ao aninhar esses comandos.

    
por 11.04.2013 / 08:08

Tags