Comando Bash para obtener el primer y último archivo de cada carpeta de forma recursiva

Comando Bash para obtener el primer y último archivo de cada carpeta de forma recursiva

tengo un directorio en

Mi DIR principal es/tmp/folder

En el interior /tmp/folderhay solo un número X de carpetas (no archivos). Por ejemplo

/tmp/folder/1
/tmp/folder/2
/tmp/folder/3
/tmp/folder/4
/tmp/folder/5

Dentro de estas carpetas hay muchos archivos de la misma extensión. Quiero de cada una de estas carpetas obtener los últimos y primeros archivos creados (hora de modificación).

La salida prefiero que sea así.

/tmp/folder/1,OLD_FILE,NEW_FILE
/tmp/folder/2,OLD_FILE,NEW_FILE
/tmp/folder/3,OLD_FILE,NEW_FILE
/tmp/folder/4,OLD_FILE,NEW_FILE
/tmp/folder/5,OLD_FILE,NEW_FILE

Analizaré este resultado usando un script, para que pueda generar el resultado que desee, pero hágalo de manera amigable para que pueda analizarlo fácilmente.

El comando bash debe ser solo 1

Respuesta1

find "$DIR" -type d | while read d; do echo "$d,$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')"; done

O, en un formato más legible y usando una variable adicional para demostración:

find "$DIR" -type d |
while read d;
do
    files=$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')
    printf '%s,%s\n' "$d" "$files";
done

Esto encuentra todos los subdirectorios donde $DIRse utiliza el findcomando. Para cada uno encontrado, se utiliza ls -trpara obtener una lista de archivos en ese directorio ordenados por fecha, el más nuevo primero.

Canalice la salida de ls -trpara sedunir la primera y la última línea con una coma: la opción -nsuprime la salida predeterminada, 1hguarda la primera línea (el nombre de archivo más nuevo) en elmantener espacio, y en la última línea del archivo (seleccionado por $) agrega el espacio de retención (nombre de archivo más nuevo) al Hespacio del patrón (delimitado por una nueva línea) y cambia esa nueva línea a una coma.

Luego, el script printfmuestra el nombre del subdirectorio seguido de una coma, seguido de los archivos que salieron de sed.

Esto no hace distinción entre directorios y archivos para la selección más antigua/más nueva, por lo que si no desea directorios allí, deberá filtrar la salida ls -tpara eliminar los directorios.

información relacionada