bash error find: -printf: primário desconhecido ou operador

1

Eu faço uma lista de todos os arquivos no meu PC.

FILES=$(find . -type f -name '*' -printf "%s/%f\n" | sort -n)

A saída deve ser:

"size/file_name"
56872/file.txt
98566/test
1000254/foo

Meu PC me dá erro

find: -printf: unknown primary or operator

Alguma solução?

    
por Joozty 27.03.2016 / 21:13

2 respostas

2

A opção -printf não está em POSIX find . É um recurso do GNU find , por exemplo, no Linux.

A implementação específica que você está usando não é mostrada; pode ser POSIX sem extensões. Por exemplo, não está em FreeBSD ou OSX .

Sem isso, você pode usar alguma alternativa, por exemplo, isso (que não manipulará espaços em branco incorporados etc., mas faz poucas 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, é (geralmente) possível melhorar a solução.

    
por 27.03.2016 / 21:20
1

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 o GNU find suporta printf de qualquer maneira (mas pode ser útil em outros contextos porque existem coisas que stat pode descobrir sobre um arquivo que find ... -printf não pode ser exibido).

FreeBSD & O Mac OS X, no entanto, é 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 por meio 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
    
por 28.03.2016 / 03:19

Tags