Cambiar el nombre de los archivos eliminando la subcadena delimitada

Cambiar el nombre de los archivos eliminando la subcadena delimitada

Tengo muchas carpetas y subcarpetas con archivos con nombre. 1. Introduction--- [ FreeCourseWeb.com ] ---.mp4Quiero cambiar el nombre de todos los archivos de forma recursiva (carpetas y subcarpetas) para simplemente 1. Introduction.mp4suprimir la subcadena --- [ FreeCourseWeb.com ] ---.

Respuesta1

Suponiendo que desea cambiar el nombre de todos los archivos que tienen un dígito al comienzo de su nombre, contienen la subcadena ---dos veces, seguida inmediatamente por .mp4al final del nombre. Además, suponiendo que desee eliminar el bit entre las dos ---subcadenas, incluidas estas subcadenas:

find . -type f -name '[[:digit:]]*---*---.mp4' -exec sh -c '
    for pathname do
        mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
    done' sh {} +

Esto encuentra todos los archivos normales con nombres que coinciden con el patrón dado, en o debajo del directorio actual, y luego elimina la cadena de sufijo que coincide ---*---.mp4y .mp4vuelve a agregar el sufijo.

Sin usar find(en bash):

shopt -s globstar nullglob dotglob

for pathname in ./**/[[:digit:]]*---*---.mp4; do
    [[ ! -f $pathname ]] && continue
    mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
done

Esto es esencialmente lo mismo que el findcomando, pero también cambiará el nombre de los enlaces simbólicos. Las tres opciones de shell que se configuran al principio habilitan el **patrón global utilizado para hacer coincidir recursivamente en subdirectorios ( globstar), garantiza que los patrones que no coinciden se eliminen en lugar de mantenerse sin expandir ( nullglob), y asegura que los patrones globales coincidan con nombres ocultos ( dotglob).

En el zshcaparazón:

for pathname in ./**/[[:digit:]]*---*---.mp4(.ND); do
    mv -i $pathname ${pathname%---*---.mp4}.mp4
done

Aquí, el punto en el calificador global (.ND)hace que el patrón anterior solo coincida con archivos normales, while Ny Dactúa como habilitar nullgloby dotglobin bash, pero solo para este patrón específico.

Respuesta2

Usando la renameherramienta del util-linuxpaquete (a veces denominada rename.ul) y find:

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename -i -- '--- [ FreeCourseWeb.com ] ---' '' {} \;

La opción -isolicita permiso para sobrescribir archivos existentes.


Usando el script Perl de Larry Wall renamey find:

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename 's/--- \[ FreeCourseWeb.com \] ---//' {} \;

Los archivos existentes no se sobrescriben de forma predeterminada a menos que se utilice la opción -f/ . En su lugar --force, verá un mensaje de error ... already exists.

información relacionada