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

0

Existe uma maneira de usar a saída de ls -ltr com xargs ?

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

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

Para comparação, eu uso o seguinte comando para usar o find para mover arquivos:

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

Podemos de alguma forma usar o caractere NUL?

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

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

O que Stéphane sugere parece ser uma alternativa.

    
por villybyun 29.11.2017 / 23:12

2 respostas

1

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

Por exemplo:

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

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

Idealmente, você desejaria:

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

Mas, infelizmente, não conheço nenhuma implementação de ls que suporte a -z / -0 e os mantenedores do GNU ls pelo menos declinou várias vezes para adicioná-lo .

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

Com as implementações GNU e ast-open de ls , na localidade C, a saída com a opção --quoting-style=shell-always é pós-processável por zsh , ksh93 ou bash :

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

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

Embora no zsh, você só faria

open ./*(om[1])

ou:

open ./Ctrl+Xm

como zsh tem suporte embutido para ordenar arquivos por hora de modificação (e muitos outros critérios que vão muito além dos recursos ls ).

FreeBSD ls tem uma opção --libxo para gerar saída json ou xml, então você pode 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 seria mais simples fazer a coisa toda em perl .

    
por 29.11.2017 / 23:40
0

Como você já foi dito: em geral, essa não é a abordagem que você deseja escolher. No entanto, como um começo:

ls -ltr | awk '/^-/ { print $9; }' | xargs
    
por 29.11.2017 / 23:29

Tags