Eu faço uma lista de todos os arquivos em meu PC.
FILES=$(find . -type f -name "*" -printf "%s/%f\n" | sort -n)
O resultado deve ser:
"size/file_name" 56872/file.txt 98566/test 1000254/foo
Meu PC me deu o erro
find: -printf: unknown primary or operator
Indo direto ao ponto, que tipo de sistema está sendo executado no PC e qual versão de find
é usada?
Resposta
A opção -printf
não está em POSIX
find
. É um recurso do GNU find
, por exemplo, no Linux.
A implementação particular você está usando não é mostrado; pode ser POSIX sem extensões. Por exemplo, não está no FreeBSD ou no OSX .
Sem isso, você pode usar alguma alternativa, por exemplo, this (que não vai lidar com espaços em branco incorporados, etc., mas faz algumas suposições sobre suas ferramentas):
find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }"
Com mais informações sobre as ferramentas disponíveis, é (normalmente) possível melhorar a solução.
Comentários
Resposta
find
e xargs
com GNU stat
:
find . -type f -print0 | xargs -0r stat -c "%s/%n"
Esta versão GNU não é realmente necessária para esta questão em particular porque GNU find
suporta printf
de qualquer maneira (mas pode ser útil em outros contextos porque há coisas que stat
podem descobrir sobre um arquivo que find ... -printf
não pode “exibir).
FreeBSD & Mac OS X, entretanto, é uma história diferente.
find
e xargs
com FreeBSD ( Mac OS X) stat
:
find . -type f -print0 | xargs -0r stat -f "%z/%N"
Opcionalmente canalize a saída através de sed -e "s:/./:/:"
para remover o ./
no início de cada nome de arquivo.
Exemplo de saída da minha VM de teste do FreeBSD:
# find . -type f -print0 | xargs -0r stat -f "%z/%N" | sed -e "s:/./:/:" | head 149/.k5login 254/.profile 1169/.cshrc 297/.login 5589/.history 171/.ssh/known_hosts 1803/.ssh/authorized_keys 6699/.bash_history 368/.bashrc 4065/.viminfo
ls
quando seria muito melhor usarfind ... -print0
e canalizar paraxargs -0r stat ...
? Ambas as versões GNU e FreeBSD destat
têm opções (infelizmente diferentes / incompatíveis) para formatar a saída e podem exibirsize/filename
conforme o OP requer .