Faccio un elenco di tutti i file nel mio PC.
FILES=$(find . -type f -name "*" -printf "%s/%f\n" | sort -n)
Loutput dovrebbe essere:
"size/file_name" 56872/file.txt 98566/test 1000254/foo
Il mio PC mi ha dato un errore
find: -printf: unknown primary or operator
Qualche soluzione?
Commenti
Risposta
Lopzione -printf
non è in POSIX
find
. È una funzionalità di GNU find
, ad esempio su Linux.
Limplementazione particolare che stai usando non è mostrato; potrebbe essere POSIX senza estensioni. Ad esempio, non è in FreeBSD o OSX .
Senza questo, puoi usare qualche alternativa, ad esempio this (che non gestirà spazi vuoti incorporati, ecc., Ma fa poche supposizioni sui tuoi strumenti):
find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }"
Con più informazioni sugli strumenti disponibili, è (di solito) possibile migliorare la soluzione.
Commenti
- Per favore e come posso fare elenco con output " file_size / file_name " come sopra?
- why parse
ls
quando sarebbe molto meglio usarefind ... -print0
e reindirizzare axargs -0r stat ...
? Entrambe le versioni GNU e FreeBSD distat
hanno opzioni (sfortunatamente diverse / incompatibili) per formattare loutput e possono visualizzaresize/filename
come richiesto dallOP . - OP non ha fornito informazioni che permettano di assumere una particolare soluzione specifica della piattaforma.
Risposta
find
e xargs
con GNU stat
:
find . -type f -print0 | xargs -0r stat -c "%s/%n"
Questa versione GNU non è realmente necessaria per questa particolare domanda perché GNU find
supporta printf
comunque (ma potrebbe essere utile in altri contesti perché ci sono cose che stat
può trovare su un file che find ... -printf
non può essere visualizzato).
FreeBSD & Mac OS X, tuttavia, è una storia diversa.
find
e xargs
con FreeBSD ( Mac OS X) stat
:
find . -type f -print0 | xargs -0r stat -f "%z/%N"
Opzionalmente convoglia loutput attraverso sed -e "s:/./:/:"
per rimuovere ./
allinizio di ogni nome di file.
Esempio di output, dalla mia VM di prova di 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
viene utilizzata?