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

  • Espandi la domanda per mostrare i nomi dei file nella tua directory.
  • Più precisamente, quale tipo di sistema è in esecuzione sul PC e quale versione di find viene utilizzata?

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 usare find ... -print0 e reindirizzare a xargs -0r stat ...? Entrambe le versioni GNU e FreeBSD di stat hanno opzioni (sfortunatamente diverse / incompatibili) per formattare loutput e possono visualizzare size/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 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *