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

  • Expandera frågan för att visa filnamnen i din katalog.
  • Mer till punkt, vilken typ av system som körs på datorn och vilken version av find används?

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ända find ... -print0 och pipa till xargs -0r stat ...? Både GNU- och FreeBSD-versioner av stat har (tyvärr olika / inkompatibla) alternativ för att formatera utdata och kan visa size/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 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *