Renomeando todos os arquivos em um diretório enquanto mantém a mesma parte inicial do nome [duplicado]

0

Eu tenho um diretório cheio de arquivos. Eu quero renomear todos os arquivos que combinam * .py para -backup.py. Como faço isso.

Eu sei que posso usar para i em * .py, mas a partir daí não sei como manter o nome inicial e apenas acrescentar backup a todos eles.

    
por dasElevator 02.07.2013 / 21:58

3 respostas

1

for i in *.py
do
    mv "$i" 'echo "$i" | sed 's/\.py$/-backup.py/''
done
    
por 02.07.2013 / 22:03
0

A essência disso é a mesma que a resposta de unxnut, mas acho que usar o sed para algo tão simples quanto extrair uma extensão é muito exagerado:

for f in ./*.py; do mv "$f" "${f%.py}-backup.py"; done

${f%.py} é a variável $ f, com o .py retirado do final. Você também pode remover coisas do começo com ${f#whatever} . Para recursividade (ou seja, trabalhando no diretório atual e em todos os subdiretórios), supondo que você tenha o bash 4+, você pode usar o globstar:

shopt -s globstar
for f in ./**/*.py; do mv "$f" "${f%.py}-backup.py"; done

Alternativamente, você pode usar renomear - na verdade, existem dois programas diferentes que usam esse nome, e qual deles você vai depender do seu sabor de * nix. perl-rename (usado pelo Debian e seus derivados, como o Ubuntu, e muitos outros):

rename 's/\.py$/-rename.py/' ./*.py

A outra renomeação usaria essa sintaxe:

rename .py -backup.py ./*.py

O loop for com mv é mais portátil, é claro: o primeiro, não-recursivo, é POSIX, e assim funcionará em todos os * nix em qualquer lugar, exceto talvez algumas peças de museu.

    
por 02.07.2013 / 23:23
0

O mesmo que evilsoup com find :

find . -name '*.py' -exec bash -c 'mv "$0" "${0%.py}-backup.py"' {} \;

ou se você não gostar de iniciar uma instância de para cada arquivo encontrado:

find . -name '*.py' -exec bash -c 'for f; do mv "$f" "${f%.py}-backup.py"; done' _ {} +

A solução find pode ser melhor se você tiver um grande número de arquivos, já que bash globbing é lento. Sinta-se à vontade para adicionar uma opção -n à opção mv (no clobber) ou -v (verbose).

    
por 02.07.2013 / 23:52