Comment convertir par lots des noms de dossier d'un format de date à un autre


10

J'ai un grand nombre de dossiers, nommés comme des dates comme ceci:

10 Aug 2010  15 Sep 2010  20 Jun 2010  25 Jul 2010  6 Nov 2010
10 Sep 2010  16 Aug 2010  20 Mar 2010  26 Aug 2010  6 Oct 2010
11 Apr 2010  16 Jun 2010  21 Jun 2010  28 Aug 2010  7 Apr 2010
12 Aug 2010  16 Oct 2010  21 Mar 2010  28 Feb 2010  7 Aug 2010
13 May 2010  17 Apr 2010  22 Feb 2010  28 Jun 2010  7 Jun 2010
14 Aug 2010  17 Aug 2010  23 Jul 2010  28 Mar 2010  8 Apr 2010
14 Jun 2010  18 Aug 2010  24 Jul 2010  29 Mar 2010  8 Aug 2010
15 Aug 2010  19 Aug 2010  24 Nov 2010  30 Aug 2010  8 Jul 2010
15 Jul 2010  4 Apr 2010  25 Apr 2010  6 May 2010   8 Sep 2010

Je souhaite que le format de date change comme suit:

2010-04-04  2010-05-03
2010-06-06  2010-07-02
2010-07-05  2010-09-01
2010-09-04  2010-09-05
2010-11-01

Comment renommer par lots un grand nombre de dossiers de DD MMM YYYYà YYYY-MM-DD?

Réponses:


12

À ma grande surprise, il semble que notre vieil ami prename(aka renamesur certains systèmes) puisse le faire - avec un peu de dispute:

$ prename -vn -- '
  BEGIN{use Time::Piece};
  s/\d+ \w+ \d+/Time::Piece->strptime($&, "%d %b %Y")->strftime("%Y-%m-%d")/e
' *
10 Aug 2010 renamed as 2010-08-10
8 Sep 2010 renamed as 2010-09-08

Alternativement, en utilisant GNU date

dirs=( ?\ ???\ ???? ??\ ???\ ???? ) # matches D MMM YYYY and DD MMM YYYY

for d in "${dirs[@]}"; do mv -v -- "$d" "$(date '+%Y-%m-%d' -d "$d")"; done

Test avec un echo(équivalent au -ndrapeau de prename ):

$ for d in "${dirs[@]}"; do echo mv -v -- "$d" "$(date '+%Y-%m-%d' -d "$d")"; done
mv -v -- 8 Sep 2010 2010-09-08
mv -v -- 10 Aug 2010 2010-08-10

Notez que l'analyse des dates peut dépendre des paramètres régionaux.


9

La datecommande GNU est très bonne pour convertir entre différents formats de date. Par exemple:

$ date -d '17 Aug 2010' +%F
2010-08-17

Dans cet esprit, si les seuls éléments de votre répertoire cible sont les sous-répertoires que vous souhaitez renommer, vous pouvez simplement faire:

for d in *; do mv "$d" "$(date -d "$d" +%F)"; done

Si vous souhaitez spécifier uniquement des répertoires , utilisez:

for dir in */; do d=${dir%%/}; mv "$d" "$(date -d "$d" +%F)"; done

Et pour faire correspondre uniquement les répertoires dont le nom commence par un nombre:

for dir in [0-9]*/; do d=${dir%%/}; mv "$d" "$(date -d "$d" +%F)"; done

6

Voici un script Python qui peut faire le changement de nom en utilisant le datetimemodule:

#!/usr/bin/env python

from datetime import datetime
import os
import os.path
import sys


def main(target):
    dir_path = os.path.abspath(target)
    for i in os.listdir(target):
        old_name = os.path.join(dir_path, i)
        d = datetime.strptime(i, '%d %b %Y').strftime('%Y-%m-%d')
        new_name = os.path.join(dir_path, d)
        os.rename(old_name, new_name)

if __name__ == '__main__':
    main(sys.argv[1])

Appelons le script rename.py. Pour utiliser le script, commencez par le rendre exécutable en exécutant chmod +x rename.pypuis en exécutant ./rename.py parent_dirparent_direst le répertoire parent contenant tous les répertoires dont vous souhaitez modifier les noms.


4

Voici un script Ruby qui fait la même chose. Mettez-le dans le répertoire où réside tous ces répertoires.

#!/usr/bin/env ruby

require 'time'

Dir.glob('*').select do |f|
    if File.directory? f
        time = Time.parse(f.to_s)
        File.rename(f, time.strftime("%Y-%m-%d"))
    end
end

Utilisez chmod +x rename.rbet ./rename.rbpour renommer les répertoires


0

si vous voulez une bonne solution GUI essayez pyrenamer facile et très configurable

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.