Cambie el nombre de varios archivos, subdirectorios e inserte caracteres en una ubicación específica en OSX

Cambie el nombre de varios archivos, subdirectorios e inserte caracteres en una ubicación específica en OSX

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, findes la mejor herramienta a utilizar. Para modificar el nombre, puede utilizarlo shen la -execllamada. 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'

Elzmvfunció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. $NUMo ${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 -wopción zmvcoloca automáticamente cada comodín en un grupo (para **, es la **/parte que está en un grupo, con el final /).
  • $fen el reemplazo significa el nombre completo del archivo fuente.
  • $VAR:hsignifica la parte del directorio de $VAR. Esto suele ser $VARhasta 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::Findpara el recorrido recursivo de árboles de directorios y File::Copypara la copia/movimiento recursivo de directorios.
  • La finddepthfunción (de File::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 finddepthes una referencia de subrutina que se ejecuta para cada archivo finddepthque se encuentra mientras recorre el árbol.
  • Comenzamos esta subrutina con una ifcondición: si el nombre del archivo con el que coincidió tiene el patrón cateory-icon, entonces formamos el nuevo nombre haciendo las correcciones necesarias y utilizamos la movefunción (from File::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!

información relacionada