Eu tenho 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
Quero renomear todos os arquivos CSV (encontrar todos os arquivos e renomeá-los) da maneira mais curta possível (provavelmente de 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
. Suponho que este seja o de Larry Wallrename
, dorename
pacote no Debian e derivado (e IIRCprename
em sistemas de persuasão do RedHat). Uma ferramenta muito útil.perl-rename
no arch linuxverbose
sinalizador, ele não produz nada e não executa as alterações no nome do arquivo, mesmo que o caminho atual tenha arquivos com nomes semelhantes a12345_foo.csv
. Preciso executar alguma tarefa adicional para fazê-la funcionar (atualmente no Fedora 30)? É uma abordagem mais limpa do que repetir. Desde já, obrigado!rename
ouprename
? Veja meu comentário acima.man {the command}
lista os autores no final.rename
comando completamente diferente ; consulte unix.stackexchange.com/a/238862/135943Experimentar:
Como funciona:
for f in *.csv; do
Isso inicia um loop sobre todos os
*.csv
arquivos.mv -i -- "$f" "XXXXX-${f#*-}"
Isso renomeia os arquivos como você deseja, solicitando interativamente antes de substituir qualquer arquivo.
done
Isso marca o fim do loop.
Exemplo:
fonte
Gostei do pequeno desafio que você postou, então aqui está a minha solução. Estou assumindo que todos os seus arquivos começam com 5 caracteres numéricos, então, usando o comando recortar 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.
É isso que você está procurando? :)
Referências:
Loop através da saída do comando no bash
Substrings no bash
fonte
no need to fork a new process for each
?cut
é um binário separado (/usr/bin/cut
) e sua execução consome mais recursos do que o uso de shell embutido.sem garfos:
Quando você usa um loop de shell, os
mv
garfos uma vez por arquivo. Orename
comando do Perl não.(O comando renomear do Perl tem algumas restrições, mas nesse caso específico essas restrições não se aplicam.)
Quanto ao
rename
comando mostrado anteriormente, sim, isso funciona, mas você tem toda essa confusão entre dois tipos diferentes de renomeação e assim por diante. Se você tem o caminho certo, ótimo, mas se não, isso também funciona.Se você não possui o comando perl-rename e não pode instalá-lo, basta fazer o seguinte:
Como você pode ver, isso usa a mesma substituição mostrada na resposta superior. Claro que o perl-renomeação tem outros sinos e assobios (a resposta superior mencionado,
-n
já, então não há-0
,-f
e assim por diante), e quanto mais deles você precisa, quanto mais você deve instalar que em vez de rolar seus próprios dessa maneira .fonte
rename
comando (a resposta principal , também usa Perl), então talvez você deva adicionar um pouco mais de explicação do que simplesmente "sem garfos" na resposta.