Mover arquivos shell script [duplicado]

1

Eu tenho um script de shell ren.sh

#!/bin/bash
/usr/bin/mv /home/imp/imp/msgs/$1.PK1 /home/imp/imp/msgs/$1.BRD
/usr/bin/mv /home/imp/imp/msgs/$1.PK2 /home/imp/imp/msgs/$1.MIX

Funciona bem, mas move apenas 2 arquivos por vez ( *.PK2 e *.PK1 ). Gostaria de mover todos os arquivos *.PK1 e *.PK2 existentes para *.MIX e *.BRD files

Isso é possível?

    
por ignatius 07.03.2017 / 23:04

3 respostas

5

Sim.

for name in /home/imp/imp/msgs/*.PK1; do
    mv "$name" "${name%.PK1}.BRD"
done

for name in /home/imp/imp/msgs/*.PK2; do
    mv "$name" "${name%.PK2}.MIX"
done

O primeiro loop itera todos os arquivos *.PK1 sob /home/imp/imp/msgs e substitui o sufixo do nome do arquivo por .BRD .

O segundo loop faz o mesmo com o outro conjunto de arquivos.

A expansão variável ${name%.PK2}.MIX removerá a string .PK2 do final do valor armazenado na variável name e, em seguida, anexará a string .MIX ao final do resultado daquela.

    
por 08.03.2017 / 00:58
0
cat - <<\eof | make -f - SRCDIR="/home/imp/imp/msgs"
.PHONY:all force
all:$(wildcard $(SRCDIR)/*.PK[12]);
%.PK1:force;/usr/bin/mv "$@" "$(@:.PK1=.BRD)";
%.PK2:force;/usr/bin/mv "$@" "$(@:.PK2=.MIX)";
eof

O comando cat cria um makefile on the fly. Os alvos all e force são phony = > alvo sempre será reconstruído, no nosso caso, mv é executado a cada vez. O $(wildcard ...) cria uma lista de todos os arquivos *.PK1, *.PK2 necessários.

    
por 08.03.2017 / 06:59
0
set -- "BRD" "MIX"
for src in /home/imp/imp/msgs/*.PK[12]; do
   eval "dest=\${src%.*}.\${${src#${src%?}}}"
   /usr/bin/mv "$src" "$dest"
done

A ideia subjacente é armazenar o mapeamento da extensão src filename na nova extensão por meio da matriz "$ @".

$src contém name.PK1 ${src%.*} contém name ${src#${src%?}} contém 1 Portanto, dest é avaliado como "nome" "." "BRD"="name.BRD"

    
por 08.03.2017 / 15:35