Identifique e atribua o arquivo mais recente à variável shell

5

Eu tenho um diretório de .jpg arquivos que crescem continuamente. Eu quero copiar o mais recente em outro lugar. Isto é o que eu tenho atualmente e funciona, apenas curioso se há uma maneira melhor de identificar o arquivo jpg mais recente, em vez de usar ls e tail .

#!/bin/bash
cd /home/pi/JPGS
fn=$(ls -rt1 | tail -1)
mv -f $fn /home/pi/WWW/webpic.jpg
    
por Levon 21.12.2013 / 22:34

3 respostas

11

Há vários caracteres em nomes de arquivos que causariam falha. Você pode melhorar com:

#! /bin/sh -
cd /home/pi/JPGS || exit
fn=$(ls -t | head -n1)
mv -f -- "$fn" /home/pi/WWW/webpic.jpg

Deixar uma variável sem aspas no contexto da lista (em shells que não sejam zsh ) é o operador split + glob, você quase nunca quer fazer isso. -- marca o final das opções, então "$fn" não será considerado uma opção se começar com - .

Isso ainda falhará se os nomes de arquivo contiverem caracteres de nova linha, mas não espaço, guia, estrela, ponto de interrogação, colchete direito ou início com traço.

O melhor é usar zsh aqui:

#! /bin/zsh -
mv -f /home/pi/JPGS/*.jpg(.om[1]) /home/pi/WWW/webpic.jpg

(.om[1]) são qualificadores glob, eles são um recurso específico de zsh . . restringe o glob para arquivos regulares (não incluirá links simbólicos, diretórios, dispositivos ...), om é para o rder em m tempo de modificação e [1] para pegar somente o primeiro arquivo.

Observe que, se você quiser atribuir isso a uma variável shell, isso deve ser uma variável de matriz:

fn=(/home/pi/JPGS/*.jpg(.om[1]))

(não que isso faça muita diferença em como você o usa mais tarde).

    
por 21.12.2013 / 22:49
7

Listando arquivo

Você pode inverter a lógica do ls um pouco.

$ ls -t | head -n1

Detalhes

   -t     sort by modification time, newest first

Agora ele aparece primeiro, então podemos usar head para retornar o primeiro resultado.

OBSERVAÇÃO: Você também pode classificar a lista por tempo de alteração (ctime), embora provavelmente queira usar o tempo de modificação acima - (mtime). A hora é a última vez que as informações meta do status do arquivo foram alteradas.

   -c     with -lt: sort by, and show, ctime (time of last modification of 
          file status information) with -l: show ctime and sort by name
          otherwise: sort by ctime, newest first

Por exemplo:

$ ls -tc | head -n1

Movendo o arquivo

Para fazer o movimento com mais clareza, você vai querer colocar o nome do arquivo entre aspas duplas.

Exemplo

$ mv -f -- "$fn" /home/pi/WWW/webpic.jpg

Isso funcionará na maioria dos casos, há um punhado de nomes de arquivos legais nos quais não serão, por exemplo, arquivos com novas linhas. Mas estes, embora legais, raramente são usados intencionalmente.

    
por 21.12.2013 / 22:51
0

Para atribuir o arquivo mais recente com um sufixo jpg , onde quer que esteja, a uma variável do shell:

fn=$( locate .jpg | xargs ls -rt | tail -1)

Obrigado por localizar, isso é rápido, mesmo se você tiver um grande número de arquivos. Principal desvantagem: arquivos modificados desde a última atualização do banco de dados de localização não são levados em consideração.

Outra desvantagem: não se comporta bem quando não há arquivo com .jpg (por causa de ls).

    
por 28.07.2016 / 18:20