Como usar a saída de ls para abrir o último arquivo modificado?

Como usar a saída de ls para abrir o último arquivo modificado?

Haveria uma maneira de usar a saída de ls -ltrwith xargs?

Suponha que o resultado de ls seja um arquivo conforme abaixo.

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

Para efeito de comparação, uso o seguinte comando para encontrar para mover arquivos:

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

Podemos de alguma forma usar o caractere NUL?


[Resolvido]
Conforme mencionado nos comentários do @illkachu, o seguinte funciona, mas não é sugerido.

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

O que Stéphane sugere parecem ser alternativas.

Responder1

Geralmente, você não faria isso, pois a saída de lsnão é pós-processável de maneira confiável.

Por exemplo:

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

não funciona se o nome do arquivo mais recente contiver caracteres de nova linha.

Idealmente, você desejaria:

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

Mas, infelizmente, não conheço nenhuma lsimplementação que suporte uma opção -z/ -0eos mantenedores do GNU lspelo menos recusaram várias vezes adicioná-lo.

Agora, existem outras maneiras com algumas implementações.

Com as implementações GNU e ast-open de ls, no código do idioma C, a saída com a --quoting-style=shell-alwaysopção é pós-processável por zsh, ksh93ou bash:

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

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

Embora em zsh, você simplesmente faria

open ./*(om[1])

ou:

abrir ./Ctrl+Xm

assim como zshsuporte integrado para classificar arquivos por hora de modificação (e muitos outros critérios que vão muito além lsdos recursos).

O FreeBSD lstem uma --libxoopção para gerar saída json ou xml, então você poderia fazer:

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

Mas então seria mais simples fazer tudo em perl.

Responder2

Como já lhe foi dito: Em geral, esta não é a abordagem que você deseja escolher. No entanto, para começar:

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

informação relacionada