bash script, lista todos os arquivos em um tamanho específico

0

então eu tenho uma linha de código como esta:

result='find . -type f -size -1000c -print0 | xargs -0 ls -Sh | head'

for i in $result; do
    item='wc -c $i'
    echo $item1 
done

isto irá imprimir todos os arquivos na dobra atual que são no máximo 1000bytes, tem o formato como:

size_do arquivo ./nome_do_arquivo

mas eu quero me livrar do símbolo "./", então eu tento usar "cut"

eu quero fazer algo como:

for i in $result; do
    item='wc -c $i'
    item1='cut -f 1 $item'    // this gives me the size 
    item2='cut -c 7- $item'   // this gives me all the character after ./ 
    echo item1, item2         // now make it print 
done

mas estou recebendo um erro como:

cut: 639: No such file or directory

alguém por favor pode me dar uma dica sobre isso? Eu aprecio isso.

    
por 齐天大圣 22.01.2015 / 05:09

4 respostas

2

Dependendo do suporte do seu sistema para POSIX, acredito que isso lhe dará o mesmo resultado que você está tentando alcançar:

    find . -type f -size -1000c -printf '%P %s Bytes\n'
    
por 22.01.2015 / 05:45
0

Veja a sinopse de cut(1) :

cut OPTION... [FILE]...

Espera que seu último argumento seja um arquivo (ou lista de arquivos). O que você está fazendo é fornecer $item como o último argumento. Parece que $item é 639 que explicaria a mensagem de erro: você está passando 639 em um lugar onde cut está esperando um argumento de nome de arquivo. Você precisa substituir $item nessas cut chamadas com $i .

Acho que a melhor maneira de extrair o nome do arquivo (menos ./ ) seria usar expansão do parâmetro em vez de depender de um número fixo de caracteres para estar sempre presente:

item2="${i#*./}"
    
por 22.01.2015 / 05:56
0

tente isto:

ls -l | awk '$5 <= 1000{print $5, $9}'
    
por 22.01.2015 / 06:17
0
find . -type f -size -1000c -printf "%s %f\n"

%s imprime o tamanho do arquivo em bytes.
%f imprime o nome do arquivo com todos os diretórios principais removidos (somente o último elemento).

    
por 22.01.2015 / 06:24