Renomeando múltiplos arquivos, Bash Script, preferencialmente com uma adição

2

Olá, vocês são maravilhosos Eu tenho um pequeno problema ao criar um script Bash. Eu tenho 7000 arquivos de imagem (dicoms). Esses arquivos pertencem juntos e devem estar em ordem em um diretório. No entanto, o programa que está criando esses arquivos parece abrir uma nova subpasta a cada 2048 arquivos e inicia com novos. Gostaria de alterar os nomes das imagens nessas subpastas.

Então, digamos que eu tenha uma pasta com 2048 imagens (chamadas de IM_0001 a IM_2048). Eu tenho uma pasta subseqüente com 900 imagens. (nomeado, novamente IM_0001 a IM_0900).

Eu gostaria de:

  1. Para percorrer todos os arquivos na segunda pasta.
  2. mv IM_ {número} IM_ {número + 2048} (de modo que IM_0001 se torna IM_2049 e assim por diante)

Isso é basicamente tudo. Existe uma maneira simples e eficiente de fazer isso (ou algo similar)? Infelizmente, eu não estou muito familiarizado com a sintaxe do Bash, então qualquer entrada seria muito apreciada. Os nomes devem ser semelhantes! Então, simplesmente renomear todos os itens na segunda pasta para (por exemplo) JM_0001 para JM_0900 fará com que meu programa de importação (eu preciso usar essa ferramenta em particular, infelizmente) estrague tudo.

Obrigado!

    
por Stefan 02.03.2015 / 15:35

3 respostas

2

Se não houver extensão no nome dos arquivos:

for i in secondfolder/IM_* ; do mv "$i" "${i%_[0-9]*}_$[10#${i##*_}+2048]" ; done
    
por 02.03.2015 / 15:59
1

Caminho simples em bash :

for i in $(ls /path/to/your-directory); do
name=$(echo "$i" | cut -d '_' -f1)
num=$(echo "$i" | cut -d'_' -f2)
num1=$(( num + 2048 ))
mv "$i" "${name}_$num1"
done
    
por 02.03.2015 / 15:55
0

Aqui, uma maneira básica de fazer algo assim usando um script de shell e o awk.

Este script de exemplo é bastante explícito para o seu caso em particular, usando o segundo campo no nome do arquivo é um inteiro válido. E confia que não há desvios perdidos nos nomes de arquivos. Um script de propósito mais geral validaria que o campo 2 é apenas um número e torna o separador de campo um parâmetro. Também assume que não há extensão de arquivo (como .img ou .png)

#!/bin/sh
WORKDIR=/(Directory where the files to be renamed are)
NUM2ADD=2048
cd $WORKDIR
echo "Old File    New File"
ls IM_* | while read i
do
   newfile='echo $i | awk -F_ -v incby=$NUM2ADD '{t=$2 + incby;printf "IM_%s",t;}''
   echo   $i    $newfile
   # after a dry run to test, replace 'echo' with 'mv' onces your sure of the result. 
done

Como é bastante provável ter uma extensão de arquivo, você pode alterar a linha do awk para:

newfile='echo $i | awk -F[_.] -v incby=$NUM2ADD '{t=$2 + incby; printf "IM_%s.%s",t,$3;}'' 

Isto preserva a extensão do arquivo e usa tanto underscore _ quanto period como separadores de campo.

    
por 02.03.2015 / 16:03

Tags