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

  • Vouw de vraag uit om de bestandsnamen in uw directory weer te geven.
  • Sterker nog, welk type systeem draait op de pc en welke versie van find wordt gebruikt?

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 om find ... -print0 te gebruiken en door te sluizen naar xargs -0r stat ...? Zowel GNU- als FreeBSD-versies van stat hebben (helaas verschillende / incompatibele) opties om de uitvoer te formatteren, en kunnen size/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 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *