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

  • Kérjük, bővítse ki a kérdést, hogy a fájlnevek megjelenjenek a könyvtárában.
  • Pontosabban: milyen típusú rendszer fut a PC-n, és az find melyik verzióját használják?

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 az find ... -print0 -et és csövezni a xargs -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 a size/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 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük