Uma bash (semelhante à solução do nerdwaller, mas sem subcampos e garfos para awk ):
#!/usr/bin/bash
shopt -s nullglob
count=0
for i in *; do
mv -nv -- "$i" "file$((++count))"
done
Comutadores para mv
:
-
-n
para nenhum estroboscópio: não sobrescreverá um arquivo existente. Remova-o se realmente quiser sobrescrever arquivos (pode não estar disponível dependendo da sua versão de mv
),
-
-v
para verbose: diga o que está fazendo. Altamente opcional (mas gosto de ter estas linhas no meu terminal para impressionar os meus colegas),
-
--
para o final das opções: sem isso, e se um nome de arquivo começar com um hífen, isso confunderia mv
, já que tentaria interpretá-lo como uma opção. Pode não estar disponível, dependendo da sua versão de mv
. Use-o se disponível!
Também estou usando o comportamento opcional do shell nullglob
para que, se não houver arquivos, você não receba nenhum erro (o loop não será executado, pois o *
seria expandido para nada neste caso) .
Se você precisa lidar com extensões também (como na versão do nerdwaller), você não precisa awk , tudo pode ser feito em bash :
#!/usr/bin/bash
shopt -s nullglob
count=0
for i in *; do
mv -nv -- "$i" "file$((++count)).${i##*.}"
done
Observe que a numeração não terá nenhum zeros à esquerda, de modo que você obterá os arquivos assim chamados:
file1
file2
...
file10
file11
...
e isso pode estragar a ordem dos arquivos nas listagens. Se você precisar de zeros iniciais também:
#!/usr/bin/bash
shopt -s nullglob
files=( * )
lz=0
for ((n=${#files[@]};n;n/=10)); do ((++lz)); done
count=0
for i in "${files[@]}"; do
printf -v n "%0${lz}d" $((++count))
mv -nv -- "$i" "file$n"
done
E se você quiser manter a extensão do arquivo original, substitua a linha
mv -nv -- "$i" "file$n"
com
mv -nv -- "$i" "file$n.${i##*.}"
Advertências .
- Como isso usa bash globbing, pode ser muito lento se você tem um grande número de arquivos em seu diretório (globbing pode levar algum tempo).
- Isso renomeia tudo, incluindo diretórios, mas não arquivos ocultos.
Curas .
- Não tenho nenhuma solução em relação à velocidade em caso de um grande número de arquivos em bash .
- Se você precisar descartar diretórios desse procedimento de renomeação e apenas renomear arquivos, adicione
[[ -f $i ]] || continue
logo após a instrução for i in *; do
.
- Se também precisar renomear arquivos ocultos, adicione
shopt -s dotglob
logo após a instrução shopt -s nullglob
.
Se você ler até aqui, eu acho que você será capaz de criar algo que corresponda à sua própria necessidade a partir dos exemplos que lhe dei, espero usar boas bash prática (desde que você escolha resolver o problema usando bash , claro).