Eu tenho vários arquivos:
10.3.100.179_01_20161018_230014_5335.jpg
10.3.100.179_01_20161018_231514_0814.jpg
10.3.100.179_01_20161018_233014_5706.jpg
10.3.100.179_01_20161018_234514_0896.jpg
10.3.100.179_01_20161018_230114_5395.jpg
10.3.100.179_01_20161018_231614_1145.jpg
10.3.100.179_01_20161018_233114_6047.jpg
10.3.100.179_01_20161018_234614_0547.jpg
10.3.100.179_01_20161018_230114_5492.jpg
10.3.100.179_01_20161018_231614_1264.jpg
10.3.100.179_01_20161018_233114_6146.jpg
10.3.100.179_01_20161018_234614_0658.jpg
10.3.100.179_01_20161018_230214_5630.jpg
10.3.100.179_01_20161018_231714_7135.jpg
Eu quero renomear com este formato:
10.4.100.135_01_20161013131108389_TIMING.jpg
10.4.100.135_01_20161013131111390_TIMING.jpg
10.4.100.135_01_20161013131114401_TIMING.jpg
10.4.100.135_01_20161013131117431_TIMING.jpg
10.4.100.135_01_20161013131120418_TIMING.jpg
10.4.100.135_01_20161013131123461_TIMING.jpg
10.4.100.135_01_20161013131126511_TIMING.jpg
Ele precisa remover o _
registro de data e hora e adicionar o _TIMING
.
command-line
batch-rename
Jojo Mendoza
fonte
fonte
10.3.100.179
com10.4.100.135
. É isso que você quer ou apenas deseja remover da_TIMING
e_
da época?10.4.100.135_01_2016-10-13T13:11:08.389_TIMING.jpg
(e "TIMING" poderia até ser removido, pois agora parece claramente uma data e hora (e milissegundos), especialmente quando o padrão se torna mais difundido. OT faz parte do padrão e eu cresceu para como ele (e retirá-lo quebra o padrão ^^):
de um nome de arquivo. Eu acredito que o Windows não suporta isso.Respostas:
Instale
renameutils
e useqmv
com seu editor de texto favorito.qmv
carrega todos os nomes no seu editor e, quando você salva e fecha, aplica suas alterações nos arquivos reais. Se as alterações forem inconsistentes (por exemplo, dois arquivos têm o mesmo nome), ela será abortada sem tocar em nada. Ele também lida com renomeação circular corretamente.Eu costumo fazer:
para mostrar apenas uma coluna de nomes (faça: somente destino). Veja como fica:
Se você combiná-lo com os vários cursores do SublimeText, Atom ou Visual Studio Code, cria uma ferramenta muito agradável e poderosa para renomear em massa. Por exemplo, para Atom, você faria
EDITOR="atom -w" qmv -f do
.fonte
Use
rename
...Com
-n
isso, o resultado será o que será feito sem fazer alterações:Se parecer correto, remova o
-n
Explicando ...
s/something/something_else/
pesquisar e substituir^
o começo do nome (ancoragem)[0-9]
qualquer número+
um ou mais caracteres anteriores\.
literal.
(sem\
isso corresponde a nenhum caractere)()
para manter essa parte$1$2$3$3
referências anteriores às coisas correspondidas anteriormente e mantidas com()
Nota: o
*
final do comando corresponde a todos os arquivos visíveis no diretório atual. Use um globo mais adequado, se necessário.fonte
prename
(p para perl, porque o primeiro argumento é uma expressão perl)mmv
pode fazê-lo da seguinte maneira:# 1, # 2, # 3, ... está referenciando cada um ao '*' correspondente aqui.
É ainda mais curto com:
fonte
Outra
rename
abordagem:Se isso parecer funcionar como você deseja, remova o
-n
.fonte
Você também pode usar o seguinte. Primeiro faça um backup dos seus arquivos e tente o seguinte:
sed 's/\(.*\)_\(.*\)_/\1\2/')
exclui os_
caracteres no registro de data e hora.Por exemplo:
fonte
find -maxdepth 1 -exec rename ... {} +
para agrupar a lista do diretório atual na linha de comando da renomeação. (adicione-name *.jpg
ou o que quiser). Isso será executado muito mais rápido do que um loop de shell que bifurca + executivossed
emv
para cada nome de arquivo, em vez de apenas uma chamada de sistema renomeada. (Você pode se livrar dased
usando bash built-in coisas regex, mas bifurcaçãomv
ainda é lento-ish.)Você provavelmente já terminou, mas aqui está uma
bash
solução (simples) para todas :"Solução simples ... do bash" é um oxímoro?
PS: A lógica do loop foi testada com um dos nomes de arquivos de exemplo. Passou.
fonte
[[ $f ~= (.*)_(.*)_(.*)_(.*)\.jpg ]];
newname=${BASH_REMATCH[1]${BASH_REMATCH:2:4}TIMING.jpg
ou algo assim. (totalmente testados e provavelmente errado, mas a idéia geral é que os grupos de captura de ir para a matriz BASH_REMATCH.)bash
) capturar grupos e, para ser sincero, o bash não é o primeiro idioma com o qual eu os experimentaria. (Eu acho quebash
é uma linguagem feia.) Ainda assim, é uma boa solução e me ensinou algo muito elogio.printf -v "$3" ...
para definir a variável cujo nome está dentro$3
). Desmontando toda a linha de comando e colocando-a de volta juntos é muito difícil de seguir / depurar, pelo menos eu achei dessa maneira enquanto tentava limpá-lo / corrigir bugs. Veja o código no githubSe você pudesse usar a GUI, eu recomendaria o pyRenamer .
Está presente na maioria das distribuições, fi no Ubuntu:
Pode fazer tudo o que você quiser e muito mais.
fonte
Aqui está o seu oneliner embutido
find
+xargs
+sed
+mv
(love oneliners):Explicação:
find . -name "*.jpg" | sort | xargs sh -c <command> sh
: liste todos os JPEGs no diretório atual e execute um comando shell para cada um (a classificação é opcional, é claro, mas mantenha as coisas um pouco mais limpas se você estiver fazendo logon em algum lugar)-print0
,-z
,-0
: É bom hábito de itens separados com binário0
quando tokenizing nomes de arquivos para evitar problemas com a in-the-middle espaços em branco (não o seu caso, porém)mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g");
: (barras invertidas nosed
regex do não ajudam a sua legibilidade, mas é simples) renomeie cada arquivo substituindo a sequência separada por sublinhado de 8 + 6 + 4 dígitos pela concatenação contígua mais essa_TIMING
coisa (\i
é uma referência anterior aoi
- grupo regex).Refs: Xargs - homem sed
fonte