Questão renomeação de vários arquivos com base na data de modificação


Eu olhei na web em vários sites, mas não consigo encontrar uma solução e a página de manual não está clara (sou iniciante no CLI). Este é o meu problema: eu tenho cerca de 200 arquivos em um diretório, esses arquivos não têm extensões e são nomeados incorretamente.

Para simplificar, imagine todos os arquivos como algo como:

Delta ---   2.0K ---  01/01/1993
Gamma ---   2.1k ---  01/01/1991
Alfa  ---   2.2k ---  04/15/1992
Bravo ---   2.3k ---  04/10/1992

O que estou tentando fazer é:

renomear todos os arquivos dessa maneira 1, 2, 3, .., mas tal que o nome é definido de acordo com a data inteira (não apenas o ano ou o mês), então a saída deve ser algo como

1 ---   2.1k ---  01/01/1991
2 ---   2.3k ---  04/10/1992
3 ---   2.2k ---  04/15/1992
4 ---   2.0k ---  01/01/1993

Além disso, quero adicionar uma extensão, por exemplo, .TXT, para que a saída final possa ser:

1.txt ---   2.1k ---  01/01/1991
2.txt ---   2.3k ---  04/10/1992
3.txt ---   2.2k ---  04/15/1992
4.txt ---   2.0k ---  01/01/1993

1
2017-11-16 23:58


origem


Eu não entendo: sua extensão de arquivo é antes do resto do nome? E o "---" representa uma seção indefinida do nome ou está realmente no nome? - Jacob Vlijm


Respostas:


Tendo feito algo assim antes, posso garantir que é fácil criar um erro de digitação que lhe dará um problema ainda maior que você já tem. Use essa informação por sua conta e risco.

No bash prompt;

i=0 ; for f in `ls -rt` ; do i=$(expr $i + 1); mv $f $i.txt; done
  • i age como um contador
  • ls -rt lista arquivos na ordem inversa modificação hora - se você copiou, moveu ou modificou os arquivos de outra forma, isso pode não fornecer a ordem de arquivo esperada. Verifique cuidadosamente, executando ls -rt como um comando separado e verifique-o - duas vezes.
  • for f inls -rt; do itera da lista de arquivos com 'f' assumindo cada nome de arquivo
  • i=$(expr $i + 1) incrementa o contador
  • mv $f $i.txt renomeia o arquivo usando o contador e adicionando a extensão .txt
  • done fecha o ciclo
  • observe que os comandos no loop são separados por ponto-e-vírgula, portanto, se você adicionar outro comando, siga-o com um ponto-e-vírgula

2
2017-11-17 01:22



Exatamente o que eu estava procurando! Obrigado! - simple mind
ele não consegue renomear os arquivos que possuem espaços. - Avinash Raj
@simplemind se você quiser simples, fácil. use a expressão aritmética do shell $((...)) gostar ...;do mv "$f" "$((i+=1)).txt"; done e também citar o nome do arquivo "$f" e nome do destino "$((i+=1)).txt" se o arquivo tiver um espaço em seu nome. - αғsнιη


Através de python,

script.py

import os
import shutil
directory = sys.argv[1]
count = '0'
for item in os.listdir(directory):
    count = str(int(count)+1)
    newname = re.sub(r'.*', count+'.txt', item)
    shutil.move(directory+"/"+item, directory+"/"+newname)

Como correr?

python3 script.py /path/to/the/directory

0
2017-11-17 07:18