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.)


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 {} .

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 % .

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.


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).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.