Eu tenho o diretório dizer /var/tmp/abc
que tem 4 arquivos:
12345-ram-3e3r5-io9490-89adu9.csv
45434-dam-qwe35-to9490-43adu9.csv
11234-cam-yy3r5-ro9490-85adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
Eu quero renomear todos os arquivos CSV (encontrar todos os arquivos e renomeá-los) da maneira mais curta possível (provavelmente uma linha) para isso:
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv
rename -n 's/(\w+)/XXXXX/' *.csv
remova o
-n
quando feliz.Tentar:
Como funciona:
for f in *.csv; do
Isso inicia um loop em todos os
*.csv
arquivos.mv -i -- "$f" "XXXXX-${f#*-}"
Isso renomeia os arquivos como você deseja, perguntando interativamente antes de substituir qualquer arquivo.
done
Isso marca o fim do loop.
Exemplo:
Estou assumindo que todos os seus arquivos começam com 5 caracteres numéricos, portanto, use o comando cut para substituir os arquivos numéricos iniciais por "XXXXX".
Abaixo, os arquivos antes do comando.
Abaixo, o comando one liner.
Abaixo, os arquivos após o comando.
Referências:
Fazendo um loop pela saída do comando no bash
Substrings no bash
sem garfos:
Quando você usa um loop de shell, os
mv
bifurca uma vez por arquivo. O comando do Perlrename
não.(O comando rename do Perl tem algumas restrições, mas neste caso específico essas restrições não se aplicam.)
Quanto ao
rename
comando mostrado anteriormente, sim, funciona, mas você tem toda essa confusão entre dois tipos diferentes de renomeação e assim por diante. Se você tiver o caminho certo, ótimo, mas se não, isso também funciona.Se você não tiver o comando perl-rename e não puder instalá-lo, faça o seguinte:
Como você pode ver, isso usa a mesma substituição mostrada na resposta principal. É claro que o perl-rename tem outros sinos e assobios (a principal resposta mencionada,
-n
já, então há-0
,-f
e assim por diante), e quanto mais deles você precisar, mais você deve instalar em vez de rolar o seu próprio dessa maneira .