¿Habría alguna forma de utilizar la salida de ls -ltr
with 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 ls
no 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 ls
implementación que admita una opción -z
/ -0
, ylos mantenedores de GNU ls
al 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-always
opción es posprocesable mediante zsh
, ksh93
o 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 zsh
tiene soporte incorporado para ordenar archivos por tiempo de modificación (y muchos otros criterios que van mucho más allá de ls
las capacidades).
FreeBSD ls
tiene una --libxo
opció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