¿Cómo cambiar el nombre de los nombres de files con acentos en macOS?

Estoy intentando cambiar el nombre de los files que incluyen el carácter "à".

Yo hago lo siguiente:

rename -v 's/à/a/g' * 

Pero muestra todos los files como sin cambios. El modo detallado muestra lo mismo.

Traté de escaping con \ pero sin suerte.

¿Cómo puedo hacer que la expresión regular coincida con este tipo de personaje?

EDITAR

La salida de perl -V :

 Summary of my perl5 (revision 5 version 18 subversion 2) configuration: Platform: osname=darwin, osvers=16.0, archname=darwin-thread-multi-2level uname='darwin osx320.apple.com 16.0 darwin kernel version 15.0.0: wed jun 22 17:57:08 pdt 2016; root:xnu-3247.1.106.2.9~1development_x86_64 x86_64 ' config_args='-ds -e -Dprefix=/usr -Dccflags=-g -pipe -Dldflags= -Dman3ext=3pm -Duseithreads -Duseshrplib -Dinc_version_list=none -Dcc=cc' hint=recommended, useposix=true, d_sigaction=define useithreads=define, usemultiplicity=define useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef use64bitint=define, use64bitall=define, uselongdouble=undef usemymalloc=n, bincompat5005=undef Compiler: cc='cc', ccflags ='-arch x86_64 -arch i386 -g -pipe -fno-common -DPERL_DARWIN -fno-strict-aliasing -fstack-protector', optimize='-Os', cppflags='-g -pipe -fno-common -DPERL_DARWIN -fno-strict-aliasing -fstack-protector' ccversion='', gccversion='4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)', gccosandvers='' intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16 ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8 alignbytes=8, prototype=define Linker and Libraries: ld='cc -mmacosx-version-min=10.12.5', ldflags ='-arch x86_64 -arch i386 -fstack-protector' libpth=/usr/lib /usr/local/lib libs= perllibs= libc=, so=dylib, useshrplib=true, libperl=libperl.dylib gnulibc_version='' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=bundle, d_dlsymun=undef, ccdlflags=' ' cccdlflags=' ', lddlflags='-arch x86_64 -arch i386 -bundle -undefined dynamic_lookup -fstack-protector' Characteristics of this binary (from libperl): Compile-time options: HAS_TIMES MULTIPLICITY PERLIO_LAYERS PERL_DONT_CREATE_GVSV PERL_HASH_FUNC_ONE_AT_A_TIME_HARD PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP PERL_PRESERVE_IVUV PERL_SAWAMPERSAND USE_64_BIT_ALL USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_PERLIO USE_PERL_ATOF USE_REENTRANT_API Locally applied patches: /Library/Perl/Updates/<version> comes before system perl directories installprivlib and installarchlib points to the Updates directory Built under darwin Compiled at Feb 6 2017 22:16:22 @INC: /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 . 

EDICION 2:

Salida de locale :

 LANG= LC_COLLATE="C" LC_CTYPE="UTF-8" LC_MESSAGES="C" LC_MONETARY="C" LC_NUMERIC="C" LC_TIME="C" LC_ALL= 

SOLUCIÓN

Aquí está en pocas palabras lo que funcionó. Todas las 3 soluciones hicieron el trabajo:

  1. rename -nv $'s/a\xcc\x80/a/g' *
  2. PERL_UNICODE=AS rename -n 's/\pM//g' ./* . (ver explicaciones en la respuesta elegida)
  3. Al cambiar a zsh , en lugar del Shell de MacOS pnetworkingeterminado ( bash ), mi command original (sin necesidad de especificar la combinación de caracteres como a\u300 ) funcionó: rename -v 's/à/a/g' * .

Si no está satisfecho con ninguna de estas soluciones, consulte la respuesta elegida para encontrar sugerencias útiles.

En macOS y con el sistema de files HFS + al less, los caracteres acentuados se codifican en su forma descompuesta, por lo que à se codifica como a\u300 ( a seguido de la combinación del carácter de combinación de acento grave ) incluso si creó el file con touch $'\ue0' (la forma precompuesta (independiente a con acento grave), causando todo tipo de errores (y el tema de uno de los renters famosos de Linus Torvald ) como por su insensibilidad a los pseudo-casos.

Notarás que si lo haces:

 touch à; echo ? 

para enumerar los nombres de file hechos de un carácter, no devuelve nada mientras:

 echo ?? 

o

 echo *a* 

Devuelve eso à (en realidad ). Y:

 $ echo ?? | uconv -x name \N{LATIN SMALL LETTER A}\N{COMBINING GRAVE ACCENT}\N{<control-000A>} 

Entonces necesitarías:

 rename $'s/a\u300/a/g' ./* 

(suponiendo zsh o shell compatible). O mediante la especificación de la encoding UTF-8 de ese carácter U + 0300 (0xcc 0x80) a mano, para shells que admiten las comillas ksh93 $'...' pero no zsh 's $'\u300' (como la versión antigua de bash encontrado en macOS):

 rename $'s/a\xcc\x80/a/g' ./* 

O deje que perl interprete esas \xcc\x80 directamente:

 rename 's/a\xcc\x80/a/g' ./* 

O el caracter Unicode:

 PERL_UNICODE=AS rename 's/\x{300}//' ./* 

O elimine todos los caracteres combinados con:

 PERL_UNICODE=AS rename -n 's/\pM//g' ./* 

Ahí, le estamos diciendo a perl que considere A rguments y S tdio streams están codificados en UTF-8 (vea perldoc perlrun para una descripción del $PERL_UNICODE env var equivalente a la opción -C ) y elimine todos los caracteres que tienen el M ark Unicode p roperty ( \pM es la abreviatura de \p{Mark} o \p{Combining_Mark} , ver perldoc perluniprops para más detalles)

Tenga en count que debe poder enumerar ese file (en zsh ) ambos con:

 ls -d $'a\u300' 

y:

 ls -d $'\ue0' 

(y $'A\u300' and possibly $'\uc0 para À ya que está destinado a ser insensible a mayúsculas y minúsculas), pero:

 ls -d *A* 

y en shells que no sean zsh :

 ls -d *$'\ue0'* ls -d *$'\xc3\xa0'* 

no coincidirá, porque el shell enumera el contenido del directory actual y aplica el patrón a cada nombre de file y el nombre del file está codificado como a\u300 que no coincidirá.

Sin embargo, en zsh y solo en macOS, el shell convierte internamente esas letras combinando acentos a su forma precompuesta en readdir() como si las pasara a través de iconv -f UTF-8-MAC -t UTF-8 . Su propio zreaddir() interno zreaddir() alnetworkingedor de readdir() devuelve U + 00E0 en lugar de aU+0300 que explica por qué echo *à* funciona allí (y no echo *a* ) y no en otro lugar.

El cambio se introdujo en junio de 2014. Consulte la discusión en la list de correo de zsh para get más detalles .

El núcleo del problema es la discrepancia entre la encoding utilizada en la input del usuario y la utilizada para almacenar (y enumerar) los nombres de los files en el sistema de files. El problema es mucho peor en coreano, donde prácticamente todos los personajes tienen una forma precompuesta y descompuesta, lo que explica por qué el tema zsh fue planteado inicialmente por una persona coreana.

Así que zsh básicamente soluciona la mala elección de la forma descompuesta de Apple en el sistema de files, por lo que se puede usar su terminación y globs, pero lamentablemente, eso solo se aplica a zsh , ls | grep à ls | grep à o find . -name '*à*' find . -name '*à*' todavía no funcionará.