Ik maak een lijst van alle bestanden op mijn pc.
FILES=$(find . -type f -name "*" -printf "%s/%f\n" | sort -n)
De uitvoer zou moeten zijn:
"size/file_name" 56872/file.txt 98566/test 1000254/foo
Mijn pc geeft me een foutmelding
find: -printf: unknown primary or operator
Eventuele oplossingen?
Opmerkingen
Antwoord
De -printf
optie staat niet in POSIX
find
. Het is een functie van GNU find
, bijvoorbeeld op Linux.
De specifieke implementatie u gebruikt wordt niet weergegeven; het kan POSIX zijn zonder extensies. Het staat bijvoorbeeld niet in FreeBSD , of OSX .
Zonder dat kunt u een alternatief gebruiken, bijv. Dit (dat geen ingesloten spaties etc. verwerkt, maar weinig aannames doet over uw tools):
find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }"
Met meer informatie over de beschikbare tools is het (meestal) mogelijk om de oplossing te verbeteren.
Opmerkingen
- Alsjeblieft en hoe kan ik lijst met uitvoer " bestandsgrootte / bestandsnaam " zoals hierboven?
- waarom parseer
ls
wanneer het veel beter zou zijn omfind ... -print0
te gebruiken en door te sluizen naarxargs -0r stat ...
? Zowel GNU- als FreeBSD-versies vanstat
hebben (helaas verschillende / incompatibele) opties om de uitvoer te formatteren, en kunnensize/filename
weergeven zoals het OP vereist . - OP leverde geen informatie die het mogelijk zou maken om een bepaalde platformspecifieke oplossing aan te nemen.
Antwoord
find
en xargs
met GNU stat
:
find . -type f -print0 | xargs -0r stat -c "%s/%n"
Deze GNU-versie is niet echt nodig voor deze specifieke vraag omdat GNU find
printf
hoe dan ook (maar het kan ook nuttig zijn in andere contexten omdat er dingen zijn die stat
kunnen achterhalen over een bestand dat find ... -printf
kan “t weergeven).
FreeBSD & Mac OS X is echter een ander verhaal.
find
en xargs
met FreeBSD ( Mac OS X) stat
:
find . -type f -print0 | xargs -0r stat -f "%z/%N"
Laat de uitvoer optioneel door sed -e "s:/./:/:"
om de ./
aan het begin van elke bestandsnaam te verwijderen.
Voorbeelduitvoer, van mijn FreeBSD-test-VM:
# 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
wordt gebruikt?