muda os últimos 10 caracteres da base (não extensão) de múltiplos arquivos

1

Eu tenho muitos arquivos de diferentes comprimentos, mas a mesma extensão e eu tentei muitos comandos para renomear todos eles de uma só vez.

É possível alterar apenas os últimos 10 caracteres da base de todos os nomes de arquivos? Os 10 últimos personagens são sempre os mesmos.

Por exemplo:

img(12345678).txt
test(12345678).txt 
download(12345678).txt
upload(12345678).txt

Desejo substituir (12345678) por abcdefghij

    
por 1001dlc 14.07.2015 / 07:17

4 respostas

8

Existem dois comandos do Linux chamados rename que estão normalmente disponíveis nas distribuições. Eu prefiro a renomeação baseada em perl, pois é mais poderosa. Você pode verificar qual deles usa $ prename --version .

Se você tiver a renomeação baseada em perl,

$ rename --version
perl-rename 1.9
$ rename 's/\(12345678\)/abcdefghij/' *.txt

Se você quiser verificar primeiro com uma execução a seco, use o sinalizador -n .

Se você tiver outro renomear,

$ rename --version
rename from util-linux 2.26.2
$ rename '(12345678)' abcdefghij *.txt

Para remover os 10 últimos caracteres antes de .txt geralmente

Se os caracteres não forem sempre os mesmos, você poderá usar isso no caso geral.

Para renomear baseado em perl,

rename 's/.{10}\.txt\Z/abcdefghij.txt/' *.txt -n

Para a outra renomeação, não tenho certeza se é possível.

    
por 14.07.2015 / 08:52
3

Tente isso. Se estiver satisfeito com os movimentos propostos, remova o echo e execute novamente.

$ ls
download(12345678).txt  img(12345678).txt  upload(12345678).txt
$ for F in *; do echo mv "$F" "${F/(12345678)/abcdefghij}"; done
mv download(12345678).txt downloadabcdefghij.txt
mv img(12345678).txt imgabcdefghij.txt
mv upload(12345678).txt uploadabcdefghij.txt
$
    
por 14.07.2015 / 08:36
2

Você pode fazer isso apenas em bash / dash / zsh , não é necessário reverter para os utilitários que podem não estar instalados. Em bash :

for x in *"(12345678).txt"; do mv "$x" "${x%(12345678).txt}"abcdefghij.txt; done

o $x%pattern é para remover o tamanho da correspondência. From man bash :

   ${parameter%word}
   ${parameter%%word}
          Remove matching suffix pattern.  The word is expanded to produce
          a pattern just as in pathname expansion.  If the pattern matches
          a  trailing portion of the expanded value of parameter, then the
          result of the expansion is the expanded value of parameter  with
          the  shortest  matching  pattern (the ''%'' case) or the longest
          matching pattern (the ''%%'' case) deleted.  If parameter  is  @
          or  *,  the  pattern  removal operation is applied to each posi‐
          tional parameter in turn, and the  expansion  is  the  resultant
          list.   If  parameter is an array variable subscripted with @ or
          *, the pattern removal operation is applied to  each  member  of
          the array in turn, and the expansion is the resultant list.
    
por 14.07.2015 / 09:19
0

tente

 ls |  awk '{printf "mv %s %s\n",$0,gsub("(12345678)","abcedfgh" );}' | bash
    
por 14.07.2015 / 08:37