web-dev-qa-db-fra.com

Changer la structure du répertoire de / YEAR / MONTH / DAY / en / YEAR-MONTH-DAY

Je dois changer la structure de mon répertoire pour mes photos de/YEAR/MONTH/DAY/à/YEAR-MONTH-DAY

Je sais que cela peut être fait avec exiftool, mais cela ne fonctionnera que sur les fichiers contenant des balises EXIF, et j'ai des fichiers xmp-sidecar correspondant à chaque image, et ceux-ci doivent également arriver. Donc, je recon reconstituer un script serait la meilleure façon.

Je me suis assis et j'ai essayé d'apprendre RegEx, sed, bash et quoi d'autre, et avec suffisamment de temps, je suppose que je devrais être en mesure de comprendre celui-ci, mais pour l'instant je suis pressé, donc toute aide serait apprécié.

// Ola

1
Ola

L'utilitaire rename dans Ubuntu peut renommer les structures de répertoires mais il ne se nettoiera pas après lui-même.

rename 's#(.+)/(.+)/(.+)#$1-$2-$3#' */*/*/

Stick -vn à la fin si vous voulez juste qu'il vous dise ce qu'il va faire avant de renommer quoi que ce soit, mais voici un petit harnais de test qui vous montre ce qui est possible:

$ mkdir -p 2014/06/15
$ touch 2014/06/15/photo_{001..003}.jpg
$ tree
.
└── 2014
    └── 06
        └── 15
            ├── photo_001.jpg
            ├── photo_002.jpg
            └── photo_003.jpg

$ rename 's#(.+)/(.+)/(.+)#$1-$2-$3#' */*/*/
$ tree
.
├── 2014
│   └── 06
└── 2014-06-15
    ├── photo_001.jpg
    ├── photo_002.jpg
    └── photo_003.jpg

Autrement dit, il est alimenté par les répertoires de troisième niveau et le changement de nom lit les deux segments précédents et le renomme, le collant dans le répertoire actuel. Comme vous pouvez le voir, il y aura une charge de répertoires annuels. En supposant qu'ils soient vides, vous pouvez nettoyer avec quelque chose comme (et je vous prie de vérifier qu'ils sont vides en premier):

find -maxdepth 1 -type d -regex '\./[0-9][0-9][0-9][0-9]' -exec rm -irf "{}" \;

J'utilise l'option -i pour la forcer à vous demander avant de supprimer chaque fichier. Retirez-le à vos risques et périls.

4
Oli
cd base
# the trailing slash in the pattern limits the results to directories, not files
for subdir in */*/*/; do
    # $subdir is now "year/mon/day/"
    subdir=${subdir%/}        # remove the trailing slash
    newdir=${subdir//\//-}    # replace all slashes with hyphens
    mkdir "$newdir"
    mv "$subdir"/* "$newdir"
done
2
glenn jackman

Essaye ça:

    TOP=$PWD
for y in *; do
  if cd $y; then
    for m in *; do
      if cd $m; then
           for d in *; do
          if cd $d; then
            mv $d $TOP/$y-$m-$d -R 
          fi
        done
        cd .. && rmdir $m
      fi
    done
    cd .. && rmdir $y
  fi
done
0
muru
 $ fn = "/ media/drive/folder/2014/06/14/name.jpg";\
 echo "mv $ fn $ (echo $ fn | sed -re, ([0-9] +) /,\1-, g ')" 
 mv/media/lecteur/dossier/2014/06/14/nom.jpg /media/drive/folder/2014-06-14-name.jpg
 $ find -type f | tee LISTOFFILES.txt 
 $ cat LISTOFFILES.txt | pendant la lecture de p; faire # une boucle dans tous les fichiers, un à la fois 
 f = "$ {p ## * /}"; bn = $ {f %% \. *}; op = "$ {p%/*} /"; 
 echo -e "$ f\n $ bn\n $ op" 
 # $ p - chemin complet vers le fichier d'origine 
 # $ f - nom de fichier avec l'extension 
 # $ bn - nom de base, nom de fichier sans extension 
 # $ op - chemin d'origine, nom de fichier et extensions supprimés 
 
 # ajoutez votre conversion ici - sur la base de ce qui précède 
 # mkdir -p "$ p" # probablement requis 
 # mv "$ p" "..." # 
 fait 

Maintenant, si vous lisez attentivement ce qui précède, vous trouverez tous les morceaux dont vous avez besoin pour accomplir cette tâche.

Comme je ne peux pas dire comment vous L'AVEZ ni COMMENT VOUS LE VOULEZ - je ne peux pas le terminer pour vous.

http://www.tldp.org/guides.html
a DEUX guides Bash pour lire et parcourir - essayez.

Je le laisse ici. Ce n'est pas un service, je l'ai fait uniquement par curiosité.
Et rappelez-vous - il PEUT y avoir des défauts, car je ne l'ai pas testé complètement.
VOUS pouvez introduire des défauts auxquels vous n'aviez pas pensé ... :-)

Bonne chance! ;-) vous en avez besoin.

0
Hannu