Teen luettelon kaikista tietokoneeni tiedostoista.

FILES=$(find . -type f -name "*" -printf "%s/%f\n" | sort -n) 

Tuloksen tulisi olla:

"size/file_name" 56872/file.txt 98566/test 1000254/foo 

Tietokoneeni antaa minulle virheen

find: -printf: unknown primary or operator 

Onko ratkaisuja?

Kommentit

  • Laajenna kysymystä niin, että tiedostonimet näkyvät hakemistossasi.
  • Tarkemmin sanottuna, minkä tyyppinen järjestelmä on käynnissä tietokoneella ja mitä versiota find: stä käytetään?

Vastaa

Vaihtoehto -printf ei ole kohdassa POSIX find . Se on GNU: n ominaisuus find , esimerkiksi Linuxissa.

Erityinen toteutus käyttämäsi ei ole näkyvissä; se voi olla POSIX ilman laajennuksia. Esimerkiksi se ei ole FreeBSD : ssä tai OSX: ssä .

Ilman sitä voit käyttää jotain muuta vaihtoehtoa, esimerkiksi tätä (joka ei käsittele upotettuja aihioita jne., Mutta tekee vain vähän oletuksia työkaluistasi):

find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }" 

Lisää tietoa käytettävissä olevista työkaluista on (yleensä) mahdollista parantaa ratkaisua.

Kommentit

  • Ole hyvä ja miten voin tehdä luettelo, jonka tuotos " file_size / file_name " kuten yllä?
  • miksi jäsennellä ls kun olisi paljon parempi käyttää find ... -print0 ja lähettää putki xargs -0r stat ...? Sekä stat -sovelluksen GNU- että FreeBSD-versioilla on (valitettavasti erilaiset / yhteensopimattomat) vaihtoehdot muotoilla lähtö ja ne voivat näyttää size/filename, kun OP vaatii .
  • OP ei toimittanut tietoja, joiden perusteella voisi olettaa tietyn alustakohtaisen ratkaisun.

Vastaa

find ja xargs GNU: lla stat:

find . -type f -print0 | xargs -0r stat -c "%s/%n" 

Tätä GNU-versiota ei todella tarvita tähän kysymykseen, koska GNU find tukee printf joka tapauksessa (mutta se voi olla hyödyllinen muissa yhteyksissä, koska on asioita, jotka stat voivat saada selville tiedostosta, jonka find ... -printf ei voi näyttää).

FreeBSD & Mac OS X on kuitenkin erilainen tarina.

find ja xargs FreeBSD: n kanssa ( Mac OS X) stat:

find . -type f -print0 | xargs -0r stat -f "%z/%N" 

Vaihtoehtoisesti ohjaa lähtö sed -e "s:/./:/:" poistaaksesi ./ jokaisen tiedostonimen alusta.

Esimerkkilähtö FreeBSD-testi VM: stä:

# 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 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *