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
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 usarfind ... -print0
y canalizar axargs -0r stat ...
? Las versiones GNU y FreeBSD destat
tienen opciones (desafortunadamente diferentes / incompatibles) para formatear la salida, y pueden mostrarsize/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
find
se usa?