J'ai un grand nombre de dossiers, nommés comme 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 veux que le format de la date change en ceci:
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 puis-je renommer par lots un grand nombre de dossiers de DD MMM YYYY
à YYYY-MM-DD
?
Un peu à ma propre surprise, cela ressemble à notre vieil ami prename
(a.k.a rename
sur certains systèmes) peut 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
Vous pouvez également utiliser 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 drapeau -n
du 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.
La commande GNU date
est très efficace pour la conversion 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 des répertoires niquement, utilisez:
for dir in */; do d=${dir%%/}; mv "$d" "$(date -d "$d" +%F)"; done
Et pour ne faire correspondre que les répertoires dont le nom commence par un numéro:
for dir in [0-9]*/; do d=${dir%%/}; mv "$d" "$(date -d "$d" +%F)"; done
Voici un script Python qui peut renommer à l'aide du module datetime
:
#!/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 __== '__main__':
main(sys.argv[1])
Appelons le script rename.py
. Pour utiliser le script, rendez-le d'abord exécutable en exécutant chmod +x rename.py
, puis en exécutant ./rename.py parent_dir
où parent_dir
représente le répertoire parent contenant tous les répertoires dont vous souhaitez modifier le nom.
Voici un script Ruby qui fait la même chose. Mettez ceci dans le répertoire où tous ces répertoires résident.
#!/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.rb
et ./rename.rb
pour renommer les répertoires.
si vous voulez une bonne solution graphique essayez pyrenamer facile et très configurable