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
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:
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!
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
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.