Mi objetivo es engañosamente simple (al menos para mí). Deseo tomar la salida de ls -lo ls -lhy 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. Elfindcomando es tremendamente útil.ls -l --block-size=M?lscomando no es el estándar POSIX, por lo que un script que dependelspodrí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 deechousar su procesamiento.... | xargs -d '\n' du -mque funciona igual de bien.-execopció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
awkcomo se muestra en la respuesta @Corey ,cut -c44-45también funcionaría después del ajuste (ya quelstiene 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 lolstanto , no se recomienda analizar el comando en absoluto.Lo mejor es usar diferentes comandos disponibles como
findostat, 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
statpodría tener diferentes opciones para BSDstat, por lo que aún no será a prueba de balas en diferentes sistemas operativos.fuente
stat.dateSin embargo, está configurado incorrectamente. Debe agregar--date=$ymd, ya quedatepor sí solo imprimirá el día actual, pero el propósito aquí es convertir el formato de fecha del archivols -la | cut -c32-33comando 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"aldatecomando, de lo contrario, imprimirá el día actual del mes.