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.