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
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žítfind ... -print0
a přesměrovat doxargs -0r stat ...
? Verze GNU i FreeBSDstat
mají (bohužel odlišné / nekompatibilní) možnosti formátování výstupu a mohou zobrazovatsize/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
find
se používá?