¿Cómo utilizar la salida de ls para abrir el último archivo modificado?

¿Cómo utilizar la salida de ls para abrir el último archivo modificado?

¿Habría alguna forma de utilizar la salida de ls -ltrwith xargs?

Supongamos que el resultado de ls es un archivo como se muestra a continuación.

ls -ltr | tail -1 | xargs -I{} open {}

A modo de comparación, utilizo el siguiente comando para usar buscar para mover archivos:

find ~/Downloads/ -iname '*hello*' -print0 | xargs -0 -I{} mv {} ./

¿Podemos usar de alguna manera el carácter NUL?


[Resuelto]
Como se menciona en los comentarios de @illkachu, lo siguiente funciona pero no se sugiere.

somecmd "$(ls -tr | tail -1)"

Lo que Stéphane sugiere parecen ser alternativas.

Respuesta1

En general, no lo haría, ya que la salida lsno se puede posprocesar de manera confiable.

Por ejemplo:

open -- "$(ls -t | head -n 1)"

no funciona si el nombre del archivo más nuevo contiene caracteres de nueva línea.

Lo ideal sería que quisieras:

ls -zt | head -zn1 | xargs -r0 open --

Pero desafortunadamente, no conozco ninguna lsimplementación que admita una opción -z/ -0, ylos mantenedores de GNU lsal menos se negaron varias veces a agregarlo.

Ahora bien, existen otras formas con algunas implementaciones.

Con las implementaciones GNU y ast-open de ls, en la configuración regional C, la salida con la --quoting-style=shell-alwaysopción es posprocesable mediante zsh, ksh93o bash:

export LC_ALL=C
eval "files=($(ls --quoting-style=shell-always -t))"

open -- "${files[0]}" # $files[1] with zsh

Aunque en zsh, simplemente harías

open ./*(om[1])

o:

abierto ./Ctrl+Xm

además zshtiene soporte incorporado para ordenar archivos por tiempo de modificación (y muchos otros criterios que van mucho más allá de lslas capacidades).

FreeBSD lstiene una --libxoopción para generar salida json o xml, por lo que puedes hacer:

ls --libxo=json -t | perl -MJSON::PP -0777 -l0 -ne '
  print decode_json($_)
    ->{"file-information"}
    ->{directory}->[0]
    ->{entry}->[0]
    ->{name}' | xargs -r0 open --

Pero entonces sería más sencillo hacer todo en formato perl.

Respuesta2

Como ya le han dicho: en general, este no es el enfoque que desea elegir. Sin embargo, como comienzo:

ls -ltr | awk '/^-/ { print $9; }' | xargs

información relacionada