Mi objetivo es engañosamente simple (al menos para mí). Deseo tomar la salida de ls -l
o ls -lh
y seleccionar solo un campo.
Estoy buscando que esto sea lo más a prueba de balas posible, lo que quiero decir, supongo que los nombres de archivo pueden tener un número variable de espacios, no todo en el campo tiene la misma longitud, etc.
Puntos de bonificación por tener un script que tomará el nombre del campo (o incluso solo un número de campo), y luego devolverá el contenido del campo.
Quiero girar
dentro:
command-line
bash
soandos
fuente
fuente
ls
. Elfind
comando es tremendamente útil.ls -l --block-size=M
?ls
comando no es el estándar POSIX, por lo que un script que dependels
podría romperse en diferentes sistemas o incluso con el tiempo. Vea la respuesta de @ormaaj en esta página para más detalles. Una forma de hacer lo que pides es con un bucle Bash. Aquí hay un ejemplo.for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done
. Por supuesto, en lugar deecho
usar su procesamiento.... | xargs -d '\n' du -m
que funciona igual de bien.-exec
opción defind
.Nunca analizar ls . Usa GNU
find
. O si la portabilidad no es importante,stat(1)
.Para leer datos que no sean listas de nombres de archivo línea por línea y dividir en campos, consulte: BashFAQ / 001
No hay métodos para leer de manera confiable una lista de nombres de archivo delimitada por una nueva línea que tenga sentido en la mayoría de las circunstancias.
fuente
Puede buscar la columna específica en shell como:
o
awk
como se muestra en la respuesta @Corey ,cut -c44-45
también funcionaría después del ajuste (ya quels
tiene columnas fijas), o lo que sea, sin embargo, el problema principal es que no será confiable y a prueba de balas (por ejemplo, en Unix puede ser$6
, no$7
, y cambia según los argumentos), por lo que no es amigable para la máquina, por lols
tanto , no se recomienda analizar el comando en absoluto.Lo mejor es usar diferentes comandos disponibles como
find
ostat
, que pueden proporcionar opciones relevantes para formatear la salida según lo necesite. Por ejemplo:Para devolver la columna de solo días de modificaciones, pruebe este ejemplo:
Vale la pena señalar que GNU
stat
podría tener diferentes opciones para BSDstat
, por lo que aún no será a prueba de balas en diferentes sistemas operativos.fuente
stat
.date
Sin embargo, está configurado incorrectamente. Debe agregar--date=$ymd
, ya quedate
por sí solo imprimirá el día actual, pero el propósito aquí es convertir el formato de fecha del archivols -la | cut -c32-33
comando con total honestidad es completamente poco confiable, no solo por las posibles dificultades con los nombres de archivo, sino simplemente porque depende de la longitud de los nombres de usuario y del tamaño de los archivos. Elstat -c "%x" *.*
comando se ve bien, pero al usarlo*.*
lo restringe solo a los nombres de archivo que contienen un punto. Supongo que la intención era capturar también archivos ocultos; en ese caso, debería permitir englobamiento de dotfiles de antemano y utilizar*
en lugar de*.*
:shopt -s dotglob; stat -c "%x" * | [...]
.--date="$ymd"
aldate
comando, de lo contrario, imprimirá el día actual del mes.