Jag gör en lista över alla filer på min dator.
FILES=$(find . -type f -name "*" -printf "%s/%f\n" | sort -n)
Utgången ska vara:
"size/file_name" 56872/file.txt 98566/test 1000254/foo
Min dator ger mig fel
find: -printf: unknown primary or operator
Några lösningar?
Kommentarer
Svar
-printf
alternativet finns inte i POSIX
find
. Det är en funktion i GNU find
, t.ex. på Linux.
Det specifika genomförandet du använder visas inte; det kan vara POSIX utan tillägg. Det finns till exempel inte i FreeBSD eller OSX .
Utan det kan du använda något alternativ, t.ex. detta (som inte hanterar inbäddade ämnen etc. men ger få antaganden om dina verktyg):
find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }"
Med mer information om tillgängliga verktyg är det (vanligtvis) möjligt att förbättra lösningen.
Kommentarer
- Snälla och hur kan jag göra lista med utdata " file_size / file_name " som ovan?
- varför analysera
ls
när det skulle vara mycket bättre att användafind ... -print0
och pipa tillxargs -0r stat ...
? Både GNU- och FreeBSD-versioner avstat
har (tyvärr olika / inkompatibla) alternativ för att formatera utdata och kan visasize/filename
som OP kräver . - OP gav ingen information som gör att man kan anta en viss plattformsspecifik lösning.
Svar
find
och xargs
med GNU stat
:
find . -type f -print0 | xargs -0r stat -c "%s/%n"
Denna GNU-version behövs inte verkligen för den här frågan eftersom GNU find
stöder printf
hur som helst (men det kan vara användbart i andra sammanhang eftersom det finns saker som stat
kan ta reda på om en fil som find ... -printf
kan inte visa.
FreeBSD & Mac OS X är dock en annan historia.
find
och xargs
med FreeBSD ( Mac OS X) stat
:
find . -type f -print0 | xargs -0r stat -f "%z/%N"
Rör eventuellt utgången till sed -e "s:/./:/:"
för att ta bort ./
i början av varje filnamn.
Provutdata från 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
används?