obtener solo nombres de archivos... ordenados por día de modificación
find + sort + cut enfoque:
find . -regex ".*/[0-9.]+" -printf "%example@unixlinux.online %f\n" | sort | cut -d' ' -f2
-
%example@unixlinux.online- Hora de la última modificación del archivo, donde@es segundos desdeJan. 1, 1970, 00:00 GMT,con parte fraccionaria -
%f- Nombre del archivo con los directorios principales eliminados (solo el último elemento)
Para ordenar en orden descendente:
find . -regex ".*/[0-9.]+" -printf "%example@unixlinux.online %f\n" | sort -k1,1r | cut -d' ' -f2
Su método se puede adaptar para trabajar en casos simples. El principal problema al que te enfrentas es que estás pasando input a ls , pero ls no toma ninguna entrada. ls toma argumentos de línea de comando. Entonces necesitas pasar la salida de find como argumentos a ls , con una sustitución de mando. Además, en caso de que coincida un directorio, pase -d a ls para enumerar el directorio en sí y no su contenido.
OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))
Solo en casos simples, porque hay dos restricciones:
- Esto se basa en una sustitución de comando sin comillas (al igual que el uso de
$OLDDATAdespués). Por lo tanto, asume que los nombres de los archivos no contienen ningún carácter especial (espacios en blanco o caracteres comodín\[*?). - Algunas versiones de
lspuede alterar los caracteres que no se pueden imprimir en la configuración regional actual. - Si la longitud total de los nombres de los archivos es demasiado larga, obtendrá un error. (Tenga en cuenta que
find … -execyxargsno puedo ayudar aquí, ya quelsdebe ejecutarse una sola vez para obtener el orden correcto de los nombres de los archivos. Todo lo que podrían hacer es ocultar errores y generar resultados que no estén ordenados correctamente, y alterar algunos caracteres más, en el caso dexargs.)
Una forma robusta y simple de hacer esto es usar zsh. Tiene la capacidad de ordenar las coincidencias con comodines, gracias a los calificadores globales.
setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
- Dado que esto no llama a ningún otro programa, no hay límite de longitud aparte de la memoria disponible, y no hay riesgo de que se altere el nombre del archivo en ningún momento.
- El resultado es una lista de cadenas (cada cadena es un nombre de archivo), no una cadena, por lo que entra en una variable de matriz.
**/atraviesa subdirectorios recursivamente, evitando el uso defind.##significa "uno o más de los anteriores" en la sintaxis global extendida de zsh, es análogo a+en sintaxis de expresiones regulares (extendida).(om)es un calificador global para ordenar archivos por tiempo de modificación, comols -t.
Notoriamente, no existe una manera simple de hacer esto de manera sólida con las herramientas POSIX o incluso con las herramientas GNU y ksh.