Haveria uma maneira de usar a saída de ls -ltr
with 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 ls
nã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 ls
implementação que suporte uma opção -z
/ -0
eos mantenedores do GNU ls
pelo 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-always
opção é 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 em zsh, você simplesmente faria
open ./*(om[1])
ou:
abrir ./Ctrl+Xm
assim como zsh
suporte integrado para classificar arquivos por hora de modificação (e muitos outros critérios que vão muito além ls
dos recursos).
O FreeBSD ls
tem uma --libxo
opçã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