renomeando o arquivo com data para uma data diferente no shell script

0

Eu tenho arquivos no meu diretório pessoal

 member_net.2017-04-20.control
 member_elig_net.2017-04-20.control
 mdcr_contractr_net.2017-04-20.control

Eu quero renomear os arquivos para uma data diferente, como no mesmo diretório

 member_net.2017-04-21.control
 member_elig_net.2017-04-21.control
 mdcr_contractr_net.2017-04-21.control

Esses arquivos não são de 0 bytes.

    
por Binay Mishra 29.09.2017 / 21:22

4 respostas

-1

Se este é um caso único, acho que o processo a seguir é o melhor ajuste entre conveniência e robustez:

  • Use ls com um padrão para selecionar os arquivos desejados e redirecionar a saída para um arquivo (o padrão é apenas um exemplo, mas não é crítico por causa da próxima etapa):

    ls member_net.*.control > file.list

  • Edite file.list no seu editor favorito: livre-se de quaisquer arquivos que você não queira alterar (é por isso que o padrão acima não é crítico); Certifique-se de que inclui todos os arquivos que você deseja alterar, adicionando todos os que faltam manualmente, se necessário; altere cada linha de xxx para mv xxx XXX , onde XXX é igual a xxx, mas com a data modificada. Essa etapa depende do seu editor, mas também pode ser feita usando sed no arquivo original e paste para colar os arquivos juntos:

    sed 's/2017-04-20/2017-04-21/g' file.list > newfile.list

    paste file.list newfile.list > bothfiles.list

    sed 's/^/mv /' bothfiles.list > commands.list

  • Agora você deve ter um arquivo commands.list que contenha linhas de comando no formulário

    mv OLDNAME NEWNAME

  • Verifique cuidadosamente para garantir que cada linha de comando esteja correta e completa.

  • Então você pode executar os comandos colocando o arquivo no seu shell:

    cat commands.list | bash

O que eu acho atrativo é que eu posso verificar o arquivo e ter certeza de que está exatamente certo e então sem tocá-lo em tudo executar todos os comandos nele e ter certeza que ele fará o coisa certa.

Isso não é tão geral quanto escrever um script de shell, mas geralmente é uma técnica útil para lembrar.

    
por 29.09.2017 / 21:53
2

Um método diferente é escrever um script de shell, por exemplo no bash:

#!/bin/bash
for f in *.2017-04-20.* ;do
    mv "$f" "${f/2017-04-20/2017-04-21}"
done

É muito mais simples do que a outra solução neste caso, mas eu recomendo que você sempre mantenha a outra solução em mente.

    
por 29.09.2017 / 21:58
0

Com o comando Perl rename :

rename -n -v 's/2017-04-20/2017-04-21/' *.control

( -n é para não-ação, -v para verboso, então você pode verificar o que ele faz antes de executá-lo).

    
por 29.09.2017 / 22:08
-1

Aqui está o script de shell que irá ajudá-lo. Você pode escolher uma data diferente. Eu usei a data atual. Salve o script de shell como myrename.sh e chame-o de ./myrename.sh dirname . Onde dirname é o nome do diretório no qual os arquivos serão afetados.

#!/bin/bash
for i in 'ls $1 | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}''
do
    x='echo $i | grep -oE   '[0-9]{4}-[0-9]{2}-[0-9]{2}''
    y='echo $i | sed "s/$x/$(date +%F)/g"'
    mv $1/$i $1/$y 2>/dev/null #incase if old date is same as current date
done
    
por 29.09.2017 / 22:08