Ok, se você não desistir de ls
, tente pelo menos usar o hábito de usar backticks para tudo, especialmente quando xargs
for melhor:
ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .
Gostaria de fazer algo assim para mover os dois últimos arquivos baixados:
mv ' ls -rt ~/Downloads/ | tail -2 ' .
Infelizmente, ls
apenas fornece os nomes dos arquivos. Como posso adaptar o código acima?
(Antes que alguém o aponte, eu estou ciente dos problemas em canalizar a saída de ls
. Eu só usaria isso quando eu soubesse os nomes de arquivos em questão.)
Ok, se você não desistir de ls
, tente pelo menos usar o hábito de usar backticks para tudo, especialmente quando xargs
for melhor:
ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .
Você pode usar o GNU find
lá:
mv $(find ~/Download -mindepth 1 -maxdepth 1 -printf '%Ts %p\n' | sort -n | cut -d ' ' -f2- | tail -n 2) .
As opções find -printf
:
%Ts
para exibir a hora como epoch
%p
o caminho do arquivo Veja man find | less +/'^ *-printf'
editar
se você precisar lidar com espaços em nomes de arquivo, recomendo essa outra solução:
find -maxdepth 1 -printf '%Ts %p\n' |
sort -n |
cut -d ' ' -f2- |
tail -n 2 |
xargs -i% mv % .
Com zsh:
mv ~/Downloads/*(.om[1,2]) .
A parte (...)
é chamada qualificadores zsh
. Cada qualificador (geralmente caracteres únicos) permite filtrar as entradas correspondentes com base nos atributos dos arquivos (tipo, tamanho, hora ...), alterar a ordem em que eles são expandidos ou modificar como eles são expandidos.
Acima, temos:
.
(ponto): seleciona apenas arquivos regulares (não diretórios, links simbólicos ...) om
: o rder a lista por m tempo de odificação. [1,2]
: selecione apenas as duas primeiras entradas. Observe também que o comando irá falhar se não houver correspondência (onde outros shells poderiam acidentalmente mover o arquivo / dir errado).
Use ls -rt ~/Downloads/*
em vez de ls -rt ~/Downloads/
. Em ls -rt ~/Downloads/*
, a string de argumento é expandida primeiro pelo shell (isso é chamado de nome do arquivo globbing ). Assim, você obtém uma lista de caminhos como argumentos para o comando ls -rt
, que então o ordena da maneira que você especifica pelas opções de ls
. Em contraste, o comando ls -rt ~/Downloads/
lê o conteúdo do diretório ~/Downloads/
. Esta é uma lista de arquivos sem o caminho do diretório.