Copia arquivos por ordem de data / hora contida no nome do arquivo?

2

Eu tenho um monte de arquivos com um padrão como este:

{UID}-YYMMDD-HHMMSSMM-NEW.xml

Ou um exemplo real:

56959-140918-12465122-NEW.XML

Eu quero copiar esses arquivos para outro diretório em data e hora contidos no nome do arquivo. Eu também só quero aplicar isso a nomes de arquivos que correspondam ao padrão acima.

Existe alguma ferramenta que existe para fazer isso? Se não, imagino que um script poderia ser usado, algo como.

  1. Corresponder nomes de arquivo por regex
  2. seção de data de correspondência por regex e lista por data crescente
  3. para cada data de correspondência por regex, em seguida, listar por hora crescente, adicionar cada arquivo à lista global.
  4. Quando terminar de organizar os arquivos de cópia da lista de arquivos
por blarg 18.09.2014 / 13:57

3 respostas

1

Se todos os arquivos correspondentes estiverem no diretório atual (e não em qualquer subdiretório ou se os nomes dos subdiretórios não contiverem - ), você poderá usar as etapas 1 a 3:

find -regex '.*/[0-9]+-[0-9]+-[0-9]+-NEW\.XML' | sort --field-separator=- --key=2 > filelist

e para o passo 4:

while IFS= read -r line; do
 cp -v $line /PATH/TO/DESTFOLDER/
done < filelist

Explicação: O padrão regexp de find corresponde a todos os arquivos com o padrão descrito. sort separa os campos por - e classifica primeiro de acordo com o segundo campo (data) e depois de acordo com os seguintes campos, aqui o terceiro campo (tempo). A maneira de processar linhas em um shell é descrita aqui . Cada linha é armazenada na variável $line e copiada para a pasta de destino. A opção -v de cp exibe qual arquivo está copiado no momento.

    
por 18.09.2014 / 14:25
1

O Zsh tem um qualificador glob para alterar a classificação de globs. Diga para classificar pelo nome do arquivo com o prefixo UID- removido.

cp <->-<->-<->-NEW.XML(oe\''REPLY=${REPLY#*-}'\') /somewhere/else/

(Ajuste o padrão se quiser ser preciso sobre o número de dígitos - <-> corresponde a qualquer sequência de dígitos.)

Observe que a ordem na qual os arquivos são copiados pode ou não ser observável. A maioria dos sistemas de arquivos fornece pelo menos a segunda granularidade para registros de data e hora, mas copiar cada arquivo provavelmente leva muito menos do que isso. Não há ordem intrínseca de arquivos em um diretório; o primeiro arquivo a ser copiado não é necessariamente o primeiro arquivo listado por ls -f (dependendo do sistema de arquivos, isso pode acontecer com frequência ou quase nunca).

    
por 19.09.2014 / 00:02
0

O que eu entendi do seu caso é que você precisa copiar arquivos com esse padrão para a pasta correspondente com base no timestamp no nome do arquivo.

para isso, basta iterar neles e mover cada arquivo para o diretório apropriado:

for i in [[:digit:]]*-NEW.XML; do  dirname="${i%6:6}"; mv $i $dirname; done;

p.s o loop aqui irá iterar apenas nos arquivos que correspondem ao regexp passado.

    
por 18.09.2014 / 15:51