Altera alguns nomes de arquivos (prefixo para o postfix)

6

Eu tenho um diretório contendo milhares de arquivos com nomes t_00xx_000xxx.png e 00xx_000xxx.png . Quero alterar os nomes dos arquivos que começam com t_ , como t_00xx_000xxx.png to 00xx_000xxx_t.png

Então, pegue o prefixo e coloque-o como um postfix para alguns dos arquivos. Isso pode ser feito em apenas um comando?

Estou executando no SUSE SLES12 SP2.

    
por Mostafa Hussein 01.08.2018 / 16:07

4 respostas

4

Isso funcionará se assumirmos que até o primeiro sublinhado seja o prefixo.

for f in *.png; do
    new=$(echo "$f" | sed -r 's/^([^_]*)_(.*)\.(.*)$/_./');
    echo "Renaming: $f => $new";
    #mv $f $new
done

Remova o # na frente de mv se você estiver satisfeito com a saída.

Com prename , seria um pouco mais fácil:

prename -n 's/^([^_]*)_(.*)\.(.*)$/$2_$1.$3/'

Se t_ for sempre o prefixo, mude para esse padrão:

for f in t_*.png; do
    new=$(echo "$f" | sed -r 's/^t_(.*)\.(.*)$/_t./');
    echo "Renaming: $f => $new";
    #mv $f $new
done
    
por 01.08.2018 / 16:13
6

Dado o padrão de nome de arquivo t_00xx_000xxx.png em que x pode ser qualquer caractere único, o loop a seguir usa o substituto de caractere ? globbing para os caracteres variáveis. O loop seleciona apenas arquivos que começam com t_ e terminam em .png . Ele usa a expansão de parâmetro para remover o t_ inicial e, em seguida, extrai a substring desejada para mover o _t para a posição desejada.

for f in t_00??_000???.png
do
  echo mv -- "$f" "${f:2:11}_t.png"
done

Para alguns nomes de arquivos criados, a saída de amostra é:

mv t_0011_000111.png 0011_000111_t.png
mv t_0012_000345.png 0012_000345_t.png
mv t_00xx_000xxx.png 00xx_000xxx_t.png

Remova a parte echo se os resultados parecerem corretos.

    
por 01.08.2018 / 16:25
5

Na sintaxe sh :

for f in t_*.*; do
  dest=${f#t_}
  dest=${dest%.*}_t.${dest##*.}
  echo mv -i -- "$f" "$dest"
done
    
por 01.08.2018 / 16:26
4

Se o SuSE SLES12 tiver o comando mcp / mmv em seu repositório, ele será uso simples de mmv :

mmv 't_*.png' '#1_t.png'

Ou, se o número de caracteres e números específicos foi emitido, você pode ser mais específico, como:

mmv 't_00??_000???.png' '00#1#2_000#3#4#5_t.png'

O primeiro argumento para mmv é source, com curingas padrão * e ? . O segundo argumento é destino, em que # 1 é substituído pelo conteúdo com o primeiro curinga correspondido, # 2 com o conteúdo que o segundo caractere coringa combinou, etc.

Exemplo:

% ls -1
t_0011_000037.png
t_0011_000038.png
t_0011_000039.png
t_0022_000001.png
t_0022_000002.png

% mmv 't_*.png' '#1_t.png'

% ls -1
0011_000037_t.png
0011_000038_t.png
0011_000039_t.png
0022_000001_t.png
0022_000002_t.png
    
por 01.08.2018 / 17:05