Hago una lista de todos los archivos en mi PC.

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

La salida debe ser:

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

Mi PC me da un error

find: -printf: unknown primary or operator 

¿Alguna solución?

Comentarios

  • Por favor, expanda la pregunta para mostrar los nombres de archivo en su directorio.
  • Más concretamente, ¿qué tipo de sistema se está ejecutando en la PC y qué versión de find se usa?

Responder

La opción -printf no está en POSIX find . Es una característica de GNU find , por ejemplo, en Linux.

La implementación particular que está utilizando no se muestra; podría ser POSIX sin extensiones. Por ejemplo, no está en FreeBSD ni en OSX .

Sin eso, puede usar alguna alternativa, por ejemplo, esto (que no manejará espacios en blanco incrustados, etc., pero hace pocas suposiciones sobre sus herramientas):

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

Con más información sobre las herramientas disponibles, (normalmente) es posible mejorar la solución.

Comentarios

  • Por favor, y cómo puedo hacer lista con salida " file_size / file_name " como arriba?
  • ¿Por qué analizar ls ¿cuándo sería mucho mejor usar find ... -print0 y canalizar a xargs -0r stat ...? Las versiones GNU y FreeBSD de stat tienen opciones (desafortunadamente diferentes / incompatibles) para formatear la salida, y pueden mostrar size/filename según lo requiera el OP. .
  • OP no proporcionó información que permitiera asumir una solución específica de la plataforma en particular.

Respuesta

find y xargs con GNU stat:

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

Esta versión GNU «no es realmente necesaria para esta pregunta en particular porque GNU find admite printf de todos modos (pero podría ser útil en otros contextos porque hay cosas que stat pueden encontrar acerca de un archivo que find ... -printf no se puede mostrar).

FreeBSD & Mac OS X, sin embargo, es una historia diferente.

find y xargs con FreeBSD ( Mac OS X) stat:

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

Opcionalmente, canalice la salida a través de sed -e "s:/./:/:" para eliminar ./ al principio de cada nombre de archivo.

Salida de muestra, de mi máquina virtual de prueba 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 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *