Como obter os caminhos relativos com ls?

8

Gostaria de fazer algo assim para mover os dois últimos arquivos baixados:

mv ` ls -rt ~/Downloads/ | tail -2 ` .

Infelizmente, lsapenas fornece os nomes dos arquivos. Como posso adaptar o código acima?

(Antes que alguém aponte, estou ciente dos problemas de canalizar a saída de ls. Eu só usaria isso quando conhecer os nomes de arquivos em questão.)

Tim
fonte
9
Use em findvez disso.
Ignacio Vazquez-Abrams

Respostas:

10

Ok, então se você não desistir ls, tente pelo menos deixar o hábito de usar reticulares para tudo, especialmente quando xargsfor um ajuste melhor:

ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .
geocar
fonte
Você xargsme agrada mais do que as costas. Mas há alguma razão técnica para preferir essa sequência de tubos e não xargso uso de reticulas ou isso é apenas uma questão de gosto?
miracle173
Nesse caso, estamos vendo apenas dois arquivos, mas se quisermos mover milhares de arquivos, podemos tentar acidentalmente criar uma linha de comando que seja muito longa.
geocar
Além disso: no caso de meras centenas de arquivos, podemos começar a trabalhar imediatamente. Com backticks, temos que esperar até que todo o subcomando seja concluído.
geocar
Além disso: quando você consegue lsxargs -0
abandonar
3
Análise lsé desencorajado: mywiki.wooledge.org/ParsingLs
Gilles Quenot
8

Você pode usar o GNU findlá:

mv $(find ~/Download -mindepth 1 -maxdepth 1 -printf '%Ts %p\n' | sort -n | cut -d ' ' -f2- | tail -n 2) .

As find -printfopções:

  • %Tspara exibir a hora como época
  • %p o caminho do arquivo

Vejo man find | less +/'^ *-printf'

editar

se você precisar lidar com espaços em nomes de arquivos, recomendo esta outra solução:

find -maxdepth 1 -printf '%Ts %p\n' |
    sort -n |
    cut -d ' ' -f2- |
    tail -n 2 |
    xargs -i% mv % .
Gilles Quenot
fonte
Explicações adicionadas sobre find -printfopções
Gilles Quenot
1
Estou curioso: existe algum motivo específico para usar em -f2-vez de -f2como uma opção cut? Para que serve o segundo traço?
Francesco Turco
1
Claro que Francesco Turco, como disse man cut, imprime até o fim, se houver mais de uma coluna.
Gilles Quenot
POST editado para trabalhar com nomes de arquivos com espaços.
Gilles Quenot
3

Use em ls -rt ~/Downloads/*vez de ls -rt ~/Downloads/. No ls -rt ~/Downloads/*argumento, a string é expandida primeiro pelo shell (isso é chamado de globbing do nome do arquivo ). Portanto, você obtém uma lista de caminhos como argumentos para o ls -rtcomando, que o classifica da maneira que você especificar pelas opções de ls. Por outro lado, o comando ls -rt ~/Downloads/lê o conteúdo do diretório ~/Downloads/. Esta é uma lista de arquivos sem o caminho do diretório.

miracle173
fonte
2

Com zsh:

mv ~/Downloads/*(.om[1,2]) .

A (...)parte é chamada de qualificadores de globbing , um dos principais recursos do 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): selecione apenas arquivos regulares (não diretórios, links simbólicos ...)
  • om: O rder a lista por m tempo ODIFICAÇÃO.
  • [1,2]: selecione apenas as duas primeiras entradas.

Observe também que o comando falhará se não houver correspondência (onde outros shells poderiam acidentalmente mover o arquivo / diretório errado).

Stéphane Chazelas
fonte