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

  • Por favor e como posso fazer lista com saída " file_size / file_name " como acima?
  • por que analisar ls quando seria muito melhor usar find ... -print0 e canalizar para xargs -0r stat ...? Ambas as versões GNU e FreeBSD de stat têm opções (infelizmente diferentes / incompatíveis) para formatar a saída e podem exibir size/filename conforme o OP requer .
  • OP não forneceu nenhuma informação que permitiria assumir uma solução específica de plataforma em particular.

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 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *