Script de shell para renomear arquivos [duplicado]

1

Eu tenho um script de shell:

#!/bin/bash
for name in /home/imp/imp/msgs/$1.PK1; do
    mv "$name" "${name%.PK1}.BRD" 2>/dev/null >/dev/null
done
for name in /home/imp/imp/msgs/$1.PK2; do
    mv "$name" "${name%.PK2}.MIX" 2>/dev/null >/dev/null
done

Funciona, mas apenas em arquivos pré-existentes. O que acontece, é que mais *.PK1 e *.PK2 são criados após a varredura inicial. Eu gostaria que este script fosse "loopado" e renomeie os arquivos criados posteriormente. Isso é possível?

ATUALIZAÇÃO:

Isso é o que eu tenho agora:

#!/bin/bash

while [ ! -z "$(ls *.PK1 *.PK2 2>/dev/null)" ]; do

for name in /home/imp/imp/msgs/$1.PK1; do
    mv "$name" "${name%.PK1}.BRD" 2>/dev/null >/dev/null
done
for name in /home/imp/imp/msgs/$1.PK2; do
    mv "$name" "${name%.PK2}.MIX" 2>/dev/null >/dev/null
done
sleep 1; done

Isso está correto?

Obrigado.

    
por ignatius 24.03.2017 / 06:43

1 resposta

2

Há algum motivo para usar $1 em for name in /path/$1.PK1 em vez de apenas for name in /path/*.PK1 ? Você passa um padrão glob para o script de propósito?

Se você quiser pegar todos os arquivos com esses sufixos e novos como eles aparecem, uma solução simples no Bash seria algo assim:

shopt -s nullglob
dir=/home/imp/imp/msgs
while true ; do
    for name in "$dir/"*.PK1; do
        mv "$name" "${name%.PK1}.BRD" 2>/dev/null >/dev/null
    done
    for name in "$dir/"*.PK2; do
        mv "$name" "${name%.PK2}.MIX" 2>/dev/null >/dev/null
    done
    sleep 1
done

Se você quiser evitar fazer um trabalho extra, você pode (no Linux) usar algo como inotifywait para esperar que novos arquivos apareçam, por exemplo, como aqui: Como usar inotifywait para assistir a um diretório para criação de arquivos de uma extensão específica

    
por 24.03.2017 / 09:56