Vytvořím seznam všech souborů ve svém PC.

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

Výstup by měl být:

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

Můj počítač mi zobrazí chybu

find: -printf: unknown primary or operator 

Nějaká řešení?

Komentáře

  • Rozbalte prosím otázku, aby se ve vašem adresáři zobrazily názvy souborů.
  • Přesněji řečeno, jaký typ systému běží na PC a jaká verze find se používá?

Odpověď

Možnost -printf není v POSIX find . Jedná se o vlastnost GNU find , např. V systému Linux.

Zvláštní implementace používáte, není zobrazeno; může to být POSIX bez rozšíření. Například není v FreeBSD nebo OSX .

Bez toho můžete použít nějakou alternativu, např. This (která nezvládne vložené mezery atd., Ale vytvoří několik předpokladů o vašich nástrojích):

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

Díky více informací o dostupných nástrojích je (obvykle) možné toto řešení vylepšit.

Komentáře

  • Prosím a jak mohu vytvořit seznam s výstupem " file_size / file_name " jako výše?
  • proč analyzovat ls kdy by bylo mnohem lepší použít find ... -print0 a přesměrovat do xargs -0r stat ...? Verze GNU i FreeBSD stat mají (bohužel odlišné / nekompatibilní) možnosti formátování výstupu a mohou zobrazovat size/filename podle požadavků OP .
  • OP neposkytlo žádné informace, které by umožňovaly předpokládat konkrétní řešení specifické pro danou platformu.

odpověď

find a xargs pomocí GNU stat:

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

Tato GNU verze pro tuto konkrétní otázku opravdu není nutná, protože GNU find podporuje printf každopádně (ale může to být užitečné v jiných kontextech, protože existují věci, které stat může zjistit o souboru, který find ... -printf nelze zobrazit).

FreeBSD & Mac OS X je však jiný příběh.

find a xargs s FreeBSD ( Mac OS X) stat:

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

Volitelně propojit výstup sed -e "s:/./:/:" odebrat ./ na začátku každého názvu souboru.

Ukázkový výstup z mého testovacího virtuálního počítače FreeBSD:

# 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 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *