Fac o listă cu toate fișierele din computerul meu.
FILES=$(find . -type f -name "*" -printf "%s/%f\n" | sort -n)
Rezultatul ar trebui să fie:
"size/file_name" 56872/file.txt 98566/test 1000254/foo
PC-ul meu dă-mi o eroare
find: -printf: unknown primary or operator
Aveți soluții?
Comentarii
Răspuns
Opțiunea -printf
nu se află în POSIX
find
. Este o caracteristică a GNU find
, de exemplu, pe Linux.
Implementarea specială pe care îl utilizați nu este afișat; ar putea fi POSIX fără extensii. De exemplu, nu se află în FreeBSD sau OSX .
Fără asta, puteți utiliza o alternativă, de exemplu, aceasta (care nu va gestiona spații goale încorporate etc., dar face câteva ipoteze despre instrumentele dvs.):
find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }"
Cu mai multe informații despre instrumentele disponibile, este (de obicei) posibil să îmbunătățim soluția.
Comentarii
- Vă rog și cum pot face listă cu ieșire " file_size / file_name " ca mai sus?
- de ce analizați
ls
când ar fi mult mai bine să folosițifind ... -print0
și să țineți laxargs -0r stat ...
? Ambele versiuni GNU și FreeBSD alestat
au opțiuni (din păcate diferite / incompatibile) pentru formatarea ieșirii și pot afișasize/filename
după cum necesită OP . - OP nu a furnizat nicio informație care să permită să se asume o anumită soluție specifică platformei.
Răspuns
find
și xargs
cu GNU stat
:
find . -type f -print0 | xargs -0r stat -c "%s/%n"
Această versiune GNU nu este cu adevărat necesară pentru această întrebare specială, deoarece GNU find
acceptă printf
oricum (dar ar putea fi util în alte contexte deoarece există lucruri pe care stat
le poate afla despre un fișier care find ... -printf
nu se poate afișa).
FreeBSD & Mac OS X este totuși o poveste diferită.
find
și xargs
cu FreeBSD ( Mac OS X) stat
:
find . -type f -print0 | xargs -0r stat -f "%z/%N"
Opțional canalizați ieșirea prin sed -e "s:/./:/:"
pentru a elimina ./
la începutul fiecărui nume de fișier.
Eșantion de ieșire, din VM-ul meu test 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
este utilizată?