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
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 brugefind ... -print0
og rør tilxargs -0r stat ...
? Både GNU- og FreeBSD-versioner afstat
har (desværre forskellige / inkompatible) muligheder for at formatere output og kan visesize/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
find
bruges?