Jeg laver en liste over alle filer på min pc.

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

Outputtet skal være:

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

Min pc giver mig fejl

find: -printf: unknown primary or operator 

Er der nogen løsninger?

Kommentarer

  • Udvid spørgsmålet for at vise filnavne i din mappe.
  • Mere præcist, hvilken type system der kører på pcen, og hvilken version af find bruges?

Svar

-printf -muligheden findes ikke i POSIX find . Det er et træk ved GNU find , fx på Linux.

Den særlige implementering du bruger vises ikke; det kan være POSIX uden udvidelser. Det er for eksempel ikke i FreeBSD eller OSX .

Uden det kan du bruge et alternativ, f.eks. Dette (som ikke håndterer indlejrede emner osv., Men der er få antagelser om dine værktøjer):

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

Med mere information om de tilgængelige værktøjer er det (normalt) muligt at forbedre løsningen.

Kommentarer

  • Vær venlig og hvordan kan jeg lave liste med output " file_size / file_name " som ovenfor?
  • hvorfor analysere ls når det ville være meget bedre at bruge find ... -print0 og rør til xargs -0r stat ...? Både GNU- og FreeBSD-versioner af stat har (desværre forskellige / inkompatible) muligheder for at formatere output og kan vise size/filename som OP kræver .
  • OP leverede ingen oplysninger, der gør det muligt for en at antage en bestemt platformsspecifik løsning.

Svar

find og xargs med GNU stat:

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

Denne GNU-version er virkelig ikke nødvendig for dette særlige spørgsmål, fordi GNU find understøtter printf alligevel (men det kan være nyttigt i andre sammenhænge, fordi der er ting, som stat kan finde ud af om en fil, der find ... -printf kan ikke vise).

FreeBSD & Mac OS X er dog en anden historie.

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

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

Rør eventuelt output gennem sed -e "s:/./:/:" for at fjerne ./ i begyndelsen af hvert filnavn.

Eksempeloutput 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 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *