0 votes

Commande de boucle de terminal pour changer la date de création de tous les fichiers d'un grand répertoire

J'ai un répertoire contenant environ 3000 fichiers vidéo/sous-titres imbriqués dans des niveaux de sous-répertoires légèrement différents et je voudrais modifier la date de création.

Presque tous les fichiers ont une année dans leur nom et l'année est toujours formatée sous la forme '[YYYY]'. touch pour changer la date de création de chaque fichier en l'année mentionnée ci-dessus. La date, le mois, l'heure et les minutes n'ont pas d'importance particulière. YYYY01010000 pour ce que j'en ai à faire.

Là où ça se complique, c'est que je voudrais aussi faire la même chose pour le répertoire contenant chaque fichier. (il s'agit d'un répertoire portant exactement le même nom que le fichier). Il y a au moins un fichier sans [YYYY] et peut-être plus, il faudrait donc qu'il y ait un cas de " laisser faire ", mais je sais que plus de 99 % d'entre eux ont l'année incluse.

Je n'ai pas assez d'expérience avec le terminal pour risquer de tout désorganiser en cas d'erreur.

la majorité des fichiers suivent cette structure de répertoire (les types de fichiers varient) :

'Videos'/'Name [YYYY]'/'Name [YYYY]'.mp4

OU pour les groupes de vidéos liés

'Videos'/'Name [ALL]'/'Name1 [YYY1]'/'Name1 [YYY1]'.mp4
'Videos'/'Name [ALL]'/'Name2 [YYY2]'/'Name2 [YYY2]'.avi
'Videos'/'Name [ALL]'/'Name3 [YYY3]'/'Name3 [YYY3]'.mkv

En ce qui concerne les répertoires 'Name [ALL]', je pense que je peux les traiter comme des bricoles, car ils devraient être faciles à trouver s'ils ont des dates de création normales, contrairement à la sortie standardisée de l'outil d'analyse de l'environnement. touch boucle.

EDIT ----

/Volumes/MediaDrive/Media/Video\ Media
 Movies
    12\ Angry\ Men\ [1957]
       12\ Angry\ Men\ [1957].avi
    12\ Years\ a\ Slave\ [2013]
       12\ Years\ a\ Slave\ [2013].avi
    13\ Sins\ [2014]
       13\ Sins\ [2014].mkv
    2\ Guns\ [2013]
       2\ Guns\ [2013].mp4
    2001\ A\ Space\ Odyssey\ [1968]
       2001\ A\ Space\ Odyssey\ [1968].mp4
       2001\ A\ Space\ Odyssey\ [1968].srt
    2012\ [2009]
       2012\ [2009].avi
    21\ Jump\ Street\ [ALL]
       21\ Jump\ Street\ [2012]
          21\ Jump\ Street\ [2012].mp4
       22\ Jump\ Street\ [2014]
           22\ Jump\ Street\ [2014].mp4
    28\ Days\ Later\ [ALL]
       28\ Days\ Later\ [2002]
          28\ Days\ Later\ [2002].mp4
       28\ Weeks\ Later\ [2007]
           28\ Weeks\ Later\ [2007].divx

Ceci ne s'applique qu'au répertoire des films, les autres répertoires en haut de l'arbre ne seront pas concernés.

A ma connaissance, tous les fichiers seront soit :
1 - seul dans un répertoire partageant leur nom.
2 - avec 1-5 fichiers de sous-titres partageant leur nom + langue à la fin, dans un répertoire partageant leur nom.
3 - dans un répertoire qui pourrait ou non être partagé leur nom suivi de '[ALL]' qui contiendra soit le cas 1 soit le cas 2.
4 - Toute version des 3 cas précédents, mais sans année ajoutée (moins de 1%, donc peut être ignoré).

0 votes

Il y a trop d'incertitude et d'imprécision dans votre question pour pouvoir y apporter une réponse raisonnable. Pouvez-vous fournir une partie de la structure réelle des dossiers/fichiers dans votre question, y compris la norme et tous les cas particuliers ?

0 votes

@nohillside j'ai ajouté un extrait du haut de l'arborescence du fichier

0 votes

Ainsi, pour "21 Jump Street", le répertoire principal (celui sans YYYY) ne devrait pas obtenir touch ed, n'est-ce pas ?

0voto

J'ai tenté d'écrire un script qui devrait fonctionner pour vous. Vous avez mentionné que vous n'êtes pas trop expérimenté avec le terminal, donc pour l'utiliser, faites ce qui suit :

  1. cd dans la racine de votre dossier Films
  2. Créez et ouvrez un nouveau fichier (peut être nommé n'importe comment, j'ai utilisé change-date ) en utilisant touch change-date; open -e change-date . Cela ouvrira un nouveau fichier dans TextEdit.
  3. Copiez-collez le script ci-dessous dans le fichier ouvert.
  4. Rendez le script exécutable en exécutant chmod +x change-date
  5. Exécutez le script en utilisant ./change-date
  6. (Facultatif) Supprimez le script à l'aide de la fonction rm change-date

Vous pouvez remplacer toutes les instances de touch avec echo touch si vous souhaitez tester ce que le script fera. Ainsi, il imprimera tous les touch qu'il exécutera, afin que vous puissiez examiner le résultat et vous assurer qu'il est correct avant de supprimer l'option echo des commandes.

#!/usr/bin/env zsh

# recursively loop through all directories in the current directory (should be Movies)
for dir in **/*(/); do
    # use a regex with sed to set $year to whatever is between [ and ] if it is a series of 4 digits
    # if there aren't brackets, or the contents inside the brackets aren't 4 digits, year will be an empty string
    year=$(echo $dir | sed -En "s/.*\[([0-9]{4})\]/\1/p")

    # if the length of year is 4 characters long
    if [[ ${#year} -eq 4 ]] then
        # set the modification time of $dir to Jan 1 of $year
        touch -t "$year"01010000.00 $dir

        # loop through all files in $dir
        for file in $dir/*(.); do
            # set the modification time of $file to Jan 1 of $year
            touch -t "$year"01010000.00 $file
        done
    fi
done

Je ne suis pas le plus expérimenté dans l'écriture de mes propres scripts, mais cela semblait fonctionner pour moi. Si quelqu'un de plus expérimenté souhaite corriger une inefficacité ou une autre erreur, n'hésitez pas.

Avant d'exécuter ce script, mon répertoire ressemblait à ceci :

$ tree -D
Movies
 [Jan 10 00:22]  12\ Angry\ Men\ [1957]
    [Jan 10 00:22]  12\ Angry\ Men\ [1957].avi
 [Jan 10 00:22]  12\ Years\ a\ Slave\ [2013]
    [Jan 10 00:22]  12\ Years\ a\ Slave\ [2013].avi
 [Jan 10 00:22]  13\ Sins\ [2014]
    [Jan 10 00:22]  13\ Sins\ [2014].mkv
 [Jan 10 00:22]  2\ Guns\ [2013]
    [Jan 10 00:22]  2\ Guns\ [2013].mp4
 [Jan 10 00:22]  2001\ A\ Space\ Odyssey\ [1968]
    [Jan 10 00:22]  2001\ A\ Space\ Odyssey\ [1968].mp4
    [Jan 10 00:22]  2001\ A\ Space\ Odyssey\ [1968].srt
 [Jan 10 00:22]  2012\ [2009]
    [Jan 10 00:22]  2012\ [2009].avi
 [Jan 10 00:22]  21\ Jump\ Street\ [ALL]
    [Jan 10 00:22]  21\ Jump\ Street\ [2012]
       [Jan 10 00:22]  21\ Jump\ Street\ [2012].mp4
    [Jan 10 00:22]  22\ Jump\ Street\ [2014]
        [Jan 10 00:22]  22\ Jump\ Street\ [2014].mp4
 [Jan 10 00:22]  28\ Days\ Later\ [ALL]
    [Jan 10 00:22]  28\ Days\ Later\ [2002]
       [Jan 10 00:22]  28\ Days\ Later\ [2002].mp4
    [Jan 10 00:22]  28\ Weeks\ Later\ [2007]
        [Jan 10 00:22]  28\ Weeks\ Later\ [2007].divx

Et après avoir couru, ça ressemblait à ça :

$ tree -D
Movies
 [Jan  1  1957]  12\ Angry\ Men\ [1957]
    [Jan  1  1957]  12\ Angry\ Men\ [1957].avi
 [Jan  1  2013]  12\ Years\ a\ Slave\ [2013]
    [Jan  1  2013]  12\ Years\ a\ Slave\ [2013].avi
 [Jan  1  2014]  13\ Sins\ [2014]
    [Jan  1  2014]  13\ Sins\ [2014].mkv
 [Jan  1  2013]  2\ Guns\ [2013]
    [Jan  1  2013]  2\ Guns\ [2013].mp4
 [Jan  1  1968]  2001\ A\ Space\ Odyssey\ [1968]
    [Jan  1  1968]  2001\ A\ Space\ Odyssey\ [1968].mp4
    [Jan  1  1968]  2001\ A\ Space\ Odyssey\ [1968].srt
 [Jan  1  2009]  2012\ [2009]
    [Jan  1  2009]  2012\ [2009].avi
 [Jan 10 00:22]  21\ Jump\ Street\ [ALL]
    [Jan  1  2012]  21\ Jump\ Street\ [2012]
       [Jan  1  2012]  21\ Jump\ Street\ [2012].mp4
    [Jan  1  2014]  22\ Jump\ Street\ [2014]
        [Jan  1  2014]  22\ Jump\ Street\ [2014].mp4
 [Jan 10 00:22]  28\ Days\ Later\ [ALL]
    [Jan  1  2002]  28\ Days\ Later\ [2002]
       [Jan  1  2002]  28\ Days\ Later\ [2002].mp4
    [Jan  1  2007]  28\ Weeks\ Later\ [2007]
        [Jan  1  2007]  28\ Weeks\ Later\ [2007].divx

EDIT ---

Pour que cette réponse fonctionne correctement sur un disque ExFAT externe, une image disque HFS+ a dû être créée pour donner les bonnes permissions. L'image disque a été créée sur le lecteur externe et le script a été exécuté avec succès à partir de cette image disque.

0 votes

Il semble qu'il y ait un problème de permissions. Le disque est un disque externe exFAT, est-ce que cela changerait le problème ? chmod d'une manière ou d'une autre ?

0 votes

Sans sudo Je reviens : -bash: ./change-date: /usr/bin/env: bad interpreter: Operation not permitted et avec sudo Je reviens : sudo: unable to execute ./change-date: Operation not permitted

0 votes

J'ai compris. J'ai ajouté une modification à la réponse pour l'expliquer.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X