Renomeia vários arquivos cujos nomes incluem '*'

2

Eu tenho um conjunto de arquivos cujos nomes contêm o caractere * . Por exemplo, um nome de arquivo pode ser ***abcdef . Desejo alterar esse nome de arquivo para 3_abcdef , substituindo o * pelo número de * que estava lá.

Eu tenho um script para renomear vários arquivos, mas não sei como alterar esse script para fazer a tarefa acima.

Isso é o que eu tenho até agora:

find drp/ -depth -name "*abc.tab" -exec rename 's/\abc.tab$/xyz.tab/' {} +

Como posso adaptá-lo a essa tarefa?

    
por Smith Dwayne 31.10.2014 / 09:09

3 respostas

7

Você pode usar uma expressão real com renomeação. Nesse caso, combinamos quantos asteriscos houver e substituímos com a duração da correspondência:

rename 's/^[*]+/sprintf("%d_", length $&)/e' -vn *

Se isso parece certo, remova o argumento -n . Isso é apenas para permitir que você teste com segurança.

Aqui está meu equipamento de teste:

$ touch \*{,\*{,\*}}abc.tab
$ rename 's/^[*]+/sprintf("%d_", length $&)/e' -vn *
***abc.tab renamed as 3_abc.tab
**abc.tab renamed as 2_abc.tab
*abc.tab renamed as 1_abc.tab

Se você também quiser fazer outra renomeação, poderá encadear:

$ rename 's/^[*]+/sprintf("%d_", length $&)/e; s/abc/xyz/' -vn *
***abc.tab renamed as 3_xyz.tab
**abc.tab renamed as 2_xyz.tab
*abc.tab renamed as 1_xyz.tab
    
por Oli 31.10.2014 / 09:28
1

Supondo que você queira substituir o número de "*" anterior pelo número real (como em seu exemplo), e levando em conta a possibilidade da existência de subpastas e ignorar arquivos invisíveis, uma opção de python seria :

#!/usr/bin/env python3

import os
import shutil
import sys

sourcedir = sys.argv[1]

for root, dirs, files in os.walk(sourcedir):
    for name in files:
        if not name.startswith(".") and name.count("*") != 0:
            number = name.count("*"); newname = str(number)+"_"+name.replace("*", "")
            shutil.move(root+"/"+name, root+"/"+newname)

Copie-o em um arquivo vazio, salve-o como rename.py , execute-o pelo comando:

python3 path/to/rename.py </path/to/files>

renomeia

****banana.txt
**monkey.mp3
**************test

para:

4_banana.txt
2_monkey.mp3
14_test
    
por Jacob Vlijm 31.10.2014 / 09:25
1

Incase se você precisar de um script bash de um forro.

$ find . -type f -exec bash -c 'file=$(basename "$0"); rn=$(echo "$file"|grep -o "*"|wc -l); on=$(echo "$file"|tr -d "*"); mv "$file" "${rn}_${on}"' {} \;

$ ls 
0_a.txt  1_a.txt  2_a.txt  3_a.txt

E se você precisar de um script de shell.

#!/bin/bash

changed=0

for file in *
do
    rn=$(echo "$file"|grep -o '*'| wc -l)
    on=$(echo "$file"|tr -d '*')
    if [ "$rn" -ne 0 ]
    then
        mv -v "$file" "$rn"_"$on"
        ((changed++))
    fi
done

if [ $changed -gt 0 ]
then
    echo "Have renamed $changed files"
else
    echo "There are no files to rename"
fi

Saída

$ ./a.sh 
'***a.txt' -> '3_a.txt'
'**a.txt' -> '2_a.txt'
'******b.txt' -> '6_b.txt'
'**b.txt' -> '2_b.txt'
Have renamed 4 files

Eu recomendaria usar o shell script, pois ele tem mais validações.

    
por Kannan Mohan 31.10.2014 / 16:54