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.