for i in *.py
do
mv "$i" 'echo "$i" | sed 's/\.py$/-backup.py/''
done
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.
for i in *.py
do
mv "$i" 'echo "$i" | sed 's/\.py$/-backup.py/''
done
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.
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 bash 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).