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'
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.
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'
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#*./}"
tente isto:
ls -l | awk '$5 <= 1000{print $5, $9}'
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).
Tags bash shell-script