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
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ää putkixargs -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
find
: stä käytetään?