Como alterar o sufixo dos arquivos

3

Em uma estrutura de diretórios que contém várias subpastas e arquivos, alguns dos nomes de arquivo têm o sufixo _create (por exemplo, java1_create ) e alguns deles com _bak ( java2_bak ).

Eu preciso renomear apenas os arquivos com o sufixo _create as _bak , para que todos os arquivos tenham o sufixo _bak .

Existe algum comando ou script para fazer isso?

    
por Ravi 25.05.2015 / 11:01

3 respostas

2

No Linux, supondo que nenhum dos seus nomes de arquivos tenha _create dentro deles (somente no final), você pode usar o utilitário rename do pacote util-linux, que é instalado em todos os Linux não embarcados. sistemas. Chame find para executar o comando em todos os arquivos em subdiretórios recursivamente.

find -depth -exec rename _create _bak {} +

No Debian e nas distribuições derivadas (Ubuntu, Mint,…) que enviam um script Perl como rename , chame rename.ul em vez de rename ou substitua rename _create _bak por rename 's/_create$/_bak/' .

    
por 25.05.2015 / 20:35
1

No Debian, Ubuntu e derivados, com o Perl rename , às vezes instalado como prename :

#enable ** globbing
shopt -s globstar 
#use the rename utility
rename -n 's/_create$/_bak/' **_create 

Remova o sinalizador -n (= --no-act ) se funcionar como esperado.

Nota:

Esta é provavelmente a maneira mais rápida e eficiente de fazer isso, especialmente se você já tem shotp -s globstar (eu tenho isso no meu ~/.bashrc ).

No entanto, você pode obter:

-bash: /usr/bin/rename: Argument list too long

se a expansão **_create estiver acima de getconf ARG_MAX caracteres (2097152 na minha caixa Linux).

Se for esse o caso, você precisará usar find -print0 com xargs -0 (consulte resposta de lcd047 ).

    
por 25.05.2015 / 11:21
0

Isso pode ser o que você procura:

for file in $(find . -name "*_create"); do mv -i $file ${file%%_create}_bak; done

Certifique-se de testá-lo antes de usá-lo em arquivos reais.

    
por 25.05.2015 / 11:14

Tags