Como renomear vários nomes de arquivos incluem subpastas?

1

Por exemplo, eu tenho os seguintes arquivos:

./dirA/fileA.png
./dirA/fileB.png
./dirA/fileC.png
./dirB/fileD.png
./dirB/fileE.png
./dirB/dirC/fileF.png

Existe algum comando ou script de uma linha para renomear o nome do arquivo para ser o seguinte?

./dirA/[email protected]
./dirA/[email protected]
./dirA/[email protected]
./dirB/[email protected]
./dirB/[email protected]
./dirB/dirC/[email protected]
    
por srjohnhuang 20.10.2016 / 08:42

1 resposta

0

Tente:

find . -type f -name '*.png' -execdir bash -c 'mv "$1" "${1%.png}@2x.png"' Move {} \;
  • find .

    Isso inicia uma pesquisa de arquivos com o diretório atual.

  • -type f

    Isso limita a pesquisa a arquivos regulares.

  • -name '*.png'

    Isso limita a pesquisa a arquivos cujos nomes terminam com .png .

  • -execdir bash -c '...' Move {} \;

    Isso executa o comando entre aspas simples com $0 atribuído a Move e $1 atribuído ao nome do arquivo que foi encontrado. No nosso caso, o comando entre aspas simples é:

  • mv "$1" "${1%.png}@2x.png"

    Isso renomeia o arquivo para terminar com @2x.png . A construção ${1%.png} remove o .png do final do nome do arquivo. Assim, ${1%.png}@2x.png substitui o .png no final do nome do arquivo por @2x.png .

Exemplo

Vamos começar com diretórios com estes arquivos:

$ find .
.
./dirA
./dirA/fileA.png
./dirA/fileC.png
./dirA/fileB.png
./dirB
./dirB/fileE.png
./dirB/dirC
./dirB/dirC/fileF.png
./dirB/fileD.png

Agora, vamos executar nosso comando:

$ find . -type f -name '*.png' -execdir bash -c 'mv "$1" "${1%.png}@2x.png"' Move {} \;

Após o comando ser executado, agora temos estes arquivos:

$ find .
.
./dirA
./dirA/[email protected]
./dirA/[email protected]
./dirA/[email protected]
./dirB
./dirB/dirC
./dirB/dirC/[email protected]
./dirB/[email protected]
./dirB/[email protected]
    
por 20.10.2016 / 08:46