Jeg lager en liste over alle filene på PC-en.

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

Utgangen skal være:

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

Min PC gir meg feil

find: -printf: unknown primary or operator 

Noen løsninger?

Kommentarer

  • Vennligst utvid spørsmålet for å vise filnavnene i katalogen din.
  • Mer til poenget, hvilken type system som kjører på PC-en, og hvilken versjon av find brukes?

Svar

-printf alternativet er ikke i POSIX find . Det er en funksjon av GNU find , f.eks. På Linux.

Den spesielle implementeringen du bruker vises ikke; det kan være POSIX uten utvidelser. Det er for eksempel ikke i FreeBSD , eller OSX .

Uten det kan du bruke et alternativ, for eksempel dette (som ikke vil håndtere innebygde emner osv., Men gir få forutsetninger om verktøyene dine):

find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }" 

Med mer informasjon om tilgjengelige verktøy er det (vanligvis) mulig å forbedre løsningen.

Kommentarer

  • Vær så snill og hvordan kan jeg lage liste med utgang " file_size / file_name " som ovenfor?
  • hvorfor analysere ls når det ville være mye bedre å bruke find ... -print0 og pipe til xargs -0r stat ...? Både GNU- og FreeBSD-versjoner av stat har (dessverre forskjellige / inkompatible) alternativer for å formatere utdataene, og kan vise size/filename som OP krever .
  • OP ga ingen informasjon som tillot en å anta en bestemt plattformspesifikk løsning.

Svar

find og xargs med GNU stat:

find . -type f -print0 | xargs -0r stat -c "%s/%n" 

Denne GNU-versjonen er ikke virkelig nødvendig for dette spesielle spørsmålet fordi GNU find støtter printf uansett (men det kan være nyttig i andre sammenhenger fordi det er ting som stat kan finne ut om en fil som find ... -printf kan ikke vise.

FreeBSD & Mac OS X er imidlertid en annen historie.

find og xargs med FreeBSD ( Mac OS X) stat:

find . -type f -print0 | xargs -0r stat -f "%z/%N" 

Eventuelt rør utgangen gjennom sed -e "s:/./:/:" for å fjerne ./ i begynnelsen av hvert filnavn.

Eksempelutgang fra min 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 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *