Tengo archivos y directorios que comienzan con"icono-cateoría-"en muchos subdirectorios. Estoy intentando cambiarles el nombre de forma recursiva a"iconos-de-categoría-". Tenga en cuenta que agregué faltantes"gramo"haciacategoríay"s"al final deiconos.
Miré muchas otras preguntas relacionadas con el cambio de nombre de varios archivos y directorios, ¡pero no pude hacer que ninguna de ellas funcionara para mí!
Se agradecería mucho una pequeña explicación sobre la respuesta.
EDITADO: Aquí hay un ejemplo de la estructura de mi directorio:
test/cateory-icon-archery/cateory-icon-archery.png
[email protected]
test/cateory-icon-automotive/cateory-icon-automotive.png
[email protected]
Respuesta1
Dado que necesita hacer esto de forma recursiva, find
es la mejor herramienta a utilizar. Para modificar el nombre, puede utilizarlo sh
en la -exec
llamada. Aquí hay un ejemplo:
find /some/path -name 'cateory-icon' -exec sh -c 'mv "$1" "${1%/*}/category-icon-${1#cateory-icon-*}"' -- {} \;
La ${1#cateory-icon-*}
expansión obtiene el nombre de archivo después de cateory-icon
.
Respuesta2
En zsh, coloque lo siguiente en su .zshrc
(o ejecútelo en la línea de comando por única vez):
autoload zmv
alias zcp='zmv -C'
alias zln='zmv -L'
Elzmv
funcióncombinado con zshcomodines y características globalespermite cambiar el nombre y copiar archivos fácilmente. Aquí hay varias formas de hacer lo que quieras:
zmv '(**/)cateory-icon-(*)' '${1}category-icons-$2'
zmv -w '**/cateory-icon-*' '${1}category-icons-$2'
zmv '**/cateory-icon-(*)' '$f:h/category-icons-$1'
Explicación de algunas características de zsh:
**/
coincide con archivos en subdirectorios de forma recursiva.- Los paréntesis en la expresión de origen designan grupos.
$NUM
o${NUM}
en la expresión de reemplazo se reemplaza por la parte del nombre original contenida en el NUMº grupo. - Los paréntesis
**
son un poco extravagantes: solo puedes ponerlos**/
, ni más ni menos. - La
-w
opciónzmv
coloca automáticamente cada comodín en un grupo (para**
, es la**/
parte que está en un grupo, con el final/
). $f
en el reemplazo significa el nombre completo del archivo fuente.$VAR:h
significa la parte del directorio de$VAR
. Esto suele ser$VAR
hasta el último/
, pero todos los casos extremos ( ,,,foo
… ) se tratan correctamente. El nombre base está disponible como .foo/
/
$VAR:t
Respuesta3
Usando Perl para máxima portabilidad:
#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;
use File::Copy qw(move);
my $new_name;
finddepth( sub {
if(/cateory-icon/){
($new_name = $File::Find::name) =~ s{.*/\Kcateory-icon}{category-icons};
move $File::Find::name => $new_name;
}
},
'.')
Explicación
- Esto hace uso de 2 módulos principales de Perl:
File::Find
para el recorrido recursivo de árboles de directorios yFile::Copy
para la copia/movimiento recursivo de directorios. - La
finddepth
función (deFile::Find
) recorre la lista de directorios proporcionada como segundo argumento (.
en este caso es el directorio actual; modifíquelo según sea necesario). - El primer argumento
finddepth
es una referencia de subrutina que se ejecuta para cada archivofinddepth
que se encuentra mientras recorre el árbol. - Comenzamos esta subrutina con una
if
condición: si el nombre del archivo con el que coincidió tiene el patróncateory-icon
, entonces formamos el nuevo nombre haciendo las correcciones necesarias y utilizamos lamove
función (fromFile::Copy
) para modificar el nombre actual al nuevo. nombre.
Descargo de responsabilidad
Este código no está probado. ¡Pruébelo primero en un árbol de directorios ficticio!