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

    
por Tim 30.09.2012 / 19:06

4 respostas

10

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 {} .
    
por 30.09.2012 / 19:25
8

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 % .
    
por 30.09.2012 / 19:36
2

Com zsh:

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

A parte (...) é chamada qualificadores , um dos recursos mais importantes de 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).

    
por 30.09.2012 / 23:38
2

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.

    
por 30.09.2012 / 20:44

Tags