0 votos

Comando de bucle de terminal para cambiar la fecha de creación de todos los archivos de un directorio grande

Tengo un directorio con aproximadamente 3000 archivos de video/subtítulos anidados en niveles ligeramente variados de subdirectorios en los que me gustaría cambiar la "fecha de creación".

Casi todos los archivos tienen un año en el nombre y el año siempre está formateado como '[AAAA]' y me gustaría utilizar touch para cambiar la fecha de creación de cada archivo al año mencionado. La fecha, el mes, la hora y los minutos no importan especialmente, así que podrían ser simplemente YYYY01010000 por lo que a mí respecta.

El problema es que me gustaría hacer lo mismo con el directorio que contiene cada archivo. (es un directorio con el mismo nombre que el archivo). Hay al menos un archivo sin [YYYY] y posiblemente más por lo que tendría que haber un caso de "dejarlo solo" pero sé que más del 99% tiene el año incluido.

Simplemente no tengo la suficiente experiencia con el terminal como para arriesgarme a tirar todo de la organización con un error.

la mayoría de los archivos siguen esta estructura de directorios (los tipos de archivos varían):

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

O para grupos de vídeos relacionados

'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 cuanto a los directorios "Nombre [TODOS]", creo que puedo manejarlos como rarezas, ya que deberían ser fáciles de encontrar si tienen fechas de creación normales, a diferencia de la salida estandarizada del touch bucle.

EDITAR ----

/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

Esto es para aplicarlo sólo al directorio de películas, por lo que los otros en la parte superior del árbol no estarán involucrados.

Por lo que sé, todos los archivos serán:
1 - solo en un directorio que comparte su nombre.
2 - con 1-5 archivos de subtítulos que comparten su nombre + idioma al final, dentro de un directorio que comparte su nombre.
3 - en un directorio que podría o no compartir su nombre seguido de '[ALL]' que contendrá el caso 1 o el caso 2.
4 - Cualquier versión de los 3 casos anteriores, pero sin un año añadido (menos del 1%, por lo que puede omitirse).

0 votos

Hay demasiada incertidumbre y vaguedad en tu pregunta ahora mismo para dar una respuesta razonable. Puede proporcionar parte de la estructura real de carpetas/archivos dentro de su pregunta, incluyendo tanto el estándar como todos los casos especiales?

0 votos

@nohillside he añadido un extracto de la parte superior del árbol de archivos

0 votos

Así que para "21 Jump Street" el directorio principal (el que no tiene YYYY) no debería tener touch ed, ¿verdad?

0voto

He intentado escribir un script que creo que debería funcionar. Mencionaste que no tienes mucha experiencia con el terminal, así que para usarlo, haz lo siguiente:

  1. cd en root de su carpeta de películas
  2. Cree y abra un nuevo archivo (puede tener cualquier nombre, yo usé change-date ) utilizando touch change-date; open -e change-date . Esto abrirá un nuevo archivo en TextEdit.
  3. Copie y pegue el script siguiente en el archivo abierto.
  4. Haz que el script sea ejecutable ejecutando chmod +x change-date
  5. Ejecuta el script utilizando ./change-date
  6. (Opcional) Eliminar el script utilizando rm change-date

Puede sustituir todas las instancias de touch con echo touch si quieres probar lo que hará el script. Esto hará que se impriman todos los touch que ejecutará, para que puedas revisar la salida y asegurarte de que parece correcta antes de eliminar el echo comandos.

#!/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

No soy el más experimentado en la escritura de mis propios scripts, pero esto parecía funcionar para mí. Si alguien con más experiencia quiere corregir alguna ineficacia o algún otro error, no dude en hacerlo.

Antes de ejecutar este script, mi directorio tenía este aspecto:

$ 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

Y después de correr, se veía así:

$ 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

EDITAR ---

Para que esta respuesta funcione correctamente en una unidad externa ExFAT, se ha tenido que crear una imagen de disco HFS+ para dar los permisos correctos. La imagen de disco se creó en la unidad externa y el script se ejecutó desde esa imagen de disco con éxito

0 votos

parece que hay algún tipo de problema de permisos. El disco es una unidad externa exFAT, ¿podría cambiar el chmod ¿de alguna manera?

0 votos

sin sudo Vuelvo: -bash: ./change-date: /usr/bin/env: bad interpreter: Operation not permitted y con sudo Vuelvo: sudo: unable to execute ./change-date: Operation not permitted

0 votos

lo he descubierto. he añadido una edición a la respuesta para explicarlo

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X