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

  • Vă rugăm să extindeți întrebarea pentru a afișa numele fișierelor în directorul dvs.
  • Mai exact, ce tip de sistem rulează pe computer și ce versiune de find este utilizată?

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ți find ... -print0 și să țineți la xargs -0r stat ...? Ambele versiuni GNU și FreeBSD ale stat au opțiuni (din păcate diferite / incompatibile) pentru formatarea ieșirii și pot afișa size/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 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *