Felteszem a számítógépem összes fájljának listáját.
FILES=$(find . -type f -name "*" -printf "%s/%f\n" | sort -n)
A kimenet a következő legyen:
"size/file_name" 56872/file.txt 98566/test 1000254/foo
A számítógépem hibát ad nekem
find: -printf: unknown primary or operator
Van valami megoldás?
Megjegyzések
Válasz
A -printf
beállítás nem szerepel a POSIX
find
. Ez a GNU find
egyik jellemzője, pl. Linux rendszeren.
Az adott megvalósítás nem jelenik meg; lehet, hogy POSIX kiterjesztések nélkül. Például nem a FreeBSD vagy OSX fájlban van.
Enélkül használhat valamilyen alternatívát, például ezt (amely nem kezeli a beágyazott üres helyeket stb., De kevés feltevést tesz az eszközeivel kapcsolatban):
find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }"
A rendelkezésre álló eszközökről további információkkal (általában) javítani lehet a megoldást.
Megjegyzések
- Kérem, és hogyan tudnék a következő kimenettel rendelkező " file_size / file_name " lista, mint fent?
- miért kell elemezni a
ls
amikor sokkal jobb lenne használni azfind ... -print0
-et és csövezni axargs -0r stat ...
-et? A (z)stat
GNU és FreeBSD verzióinak is vannak (sajnos különböző / inkompatibilis) lehetőségei a kimenet formázására, és az OP igénye szerint megjeleníthetik asize/filename
lehetőséget. . - Az OP nem adott olyan információt, amely lehetővé tenné egy adott platform-specifikus megoldás feltételezését.
Válasz
find
és xargs
válasz GNU-val stat
:
find . -type f -print0 | xargs -0r stat -c "%s/%n"
Ez a GNU verzió nem igazán szükséges ehhez a kérdéshez, mert a GNU find
támogatja a printf
amúgy (de hasznos lehet más összefüggésekben is, mert vannak dolgok, amelyeket stat
megtudhat egy fájlról, amelyet find ... -printf
nem jeleníthető meg.
A FreeBSD & A Mac OS X azonban más történet.
find
és xargs
a FreeBSD-vel ( Mac OS X) stat
:
find . -type f -print0 | xargs -0r stat -f "%z/%N"
A kimenetet opcionálisan vezetheti át sed -e "s:/./:/:"
a ./
eltávolításához minden fájlnév elején.
Minta kimenet a FreeBSD teszt virtuális gépemből:
# 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
melyik verzióját használják?