Inverte os nomes dos arquivos de troca de arquivos em uma pasta de baixo para cima

0

Eu tenho alguns arquivos jpg em uma determinada pasta:

hg_test_spr.jpg
hg_test00001.jpg
hg_test00002.jpg
hg_test00003.jpg
hg_test00004.jpg
hg_test00005.jpg
hg_test00006.jpg
.
.
.
hg_test01200.jpg

Eu quero renomear os arquivos na ordem inversa, para que o nome do primeiro arquivo seja trocado pelo último, o segundo com o segundo e assim por diante.

Em outras palavras:

hg_test_spr.jpg --> DO NOT RENAME THIS
hg_test00001.jpg --> hg_test01200.jpg
hg_test00002.jpg --> hg_test01199.jpg
hg_test00003.jpg --> hg_test01198.jpg
hg_test00004.jpg --> hg_test01197.jpg
hg_test00005.jpg --> hg_test01196.jpg
hg_test00006.jpg --> hg_test01195.jpg
.
.
.
hg_test01199.jpg --> hg_test00002.jpg
hg_test01200.jpg --> hg_test00001.jpg

Eu posso obter a lista de arquivos na ordem inversa desta maneira:

ls *.bmp | tac | tee reverse_order.txt

Ou talvez seja melhor:

ls *hg_test0*.bmp | tac | tee reverse_order.txt

E então, talvez algo assim:

mkdir renamed
for file in *hg_test0*.bmp; do read line;  cp -v "${file}" "renamed/${line}";  done < reverse_order.txt

Qual é a melhor maneira de fazer isso?

    
por benett 26.07.2018 / 13:34

2 respostas

1

Seguindo a sua ordem numérica de arquivos com 5 dígitos representando você, você poderia apenas usar os recursos glob do shell para renomear como você gostaria de

shopt -s nullglob
fileList=(hg_test[0-9]*)
count="${#fileList[@]}"

for file in hg_test[0-9]*; do 
     echo "$file" "hg_test$(printf "%05d" "$count").jpg"
     ((count--))
done

Isso basicamente irá echo do nome real do arquivo com o nome do arquivo substituído. Depois que você encontrar os nomes intactos, remova o echo e use o comando mv .

    
por 26.07.2018 / 14:10
1

Assumindo que hg_*[0-9].jpg se expande para todos os arquivos que você deseja renomear, na ordem "encaminhar" correta e que deseja gravar os arquivos renomeados no subdiretório renamed .

Usando bash :

mkdir renamed || exit 1    # fail if this directory exists
names=( hg_*[0-9].jpg )

for (( i=0; i < "${#names[@]}"; ++i )); do
    cp "${names[i]}" renamed/"${names[-(i+1)]}"
done

Isso primeiro gera uma lista de nomes de arquivos que são mantidos no array names . O loop passa por essa lista gerada de nomes e escolhe um novo nome para cada arquivo em um deslocamento do final da lista. Nenhum arquivo existente será modificado e cópias com novos nomes serão gravadas na pasta renamed .

    
por 26.07.2018 / 14:01