Je fais une liste de tous les fichiers de mon PC.
FILES=$(find . -type f -name "*" -printf "%s/%f\n" | sort -n)
Le résultat doit être:
"size/file_name" 56872/file.txt 98566/test 1000254/foo
Mon PC me donne une erreur
find: -printf: unknown primary or operator
Des solutions?
Commentaires
Réponse
Loption -printf
nest pas dans POSIX
find
. Il sagit dune fonctionnalité de GNU find
, par exemple sous Linux.
Limplémentation particulière que vous utilisez nest pas affiché; ce pourrait être POSIX sans extensions. Par exemple, il ne se trouve pas dans FreeBSD , ou OSX .
Sans cela, vous pouvez utiliser une alternative, par exemple celle-ci (qui ne gérera pas les blancs intégrés, etc., mais fait peu dhypothèses sur vos outils):
find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }"
Avec plus dinformations sur les outils disponibles, il est (généralement) possible daméliorer la solution.
Commentaires
- Sil vous plaît et comment puis-je faire liste avec la sortie " file_size / file_name " comme ci-dessus?
- pourquoi analyser
ls
quand il serait préférable dutiliserfind ... -print0
et de diriger versxargs -0r stat ...
? Les versions GNU et FreeBSD destat
ont des options (malheureusement différentes / incompatibles) pour formater la sortie, et peuvent affichersize/filename
selon les besoins de lOP . - OP na fourni aucune information permettant de supposer une solution spécifique à la plate-forme.
Réponse
find
et xargs
avec GNU stat
:
find . -type f -print0 | xargs -0r stat -c "%s/%n"
Cette version de GNU nest pas vraiment nécessaire pour cette question particulière, car GNU find
prend en charge printf
de toute façon (mais cela peut être utile dans dautres contextes car il y a des choses que stat
peut trouver sur un fichier que find ... -printf
ne peut pas safficher).
FreeBSD & Mac OS X, cependant, est une autre histoire.
find
et xargs
avec FreeBSD ( Mac OS X) stat
:
find . -type f -print0 | xargs -0r stat -f "%z/%N"
Éventuellement diriger la sortie via sed -e "s:/./:/:"
pour supprimer le ./
au début de chaque nom de fichier.
Exemple de sortie, de ma VM de test 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
find
est utilisée?