macOSでアクセントにファイル名を変更するには?

macOSでアクセントにファイル名を変更するには?

「à」文字を含むファイルの名前を変更しようとしています。

私は次のことを行います。

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

ただし、すべてのファイルが変更されていないことを示しています。 Verboseモードでは、同じ内容が表示されます。

脱出しようとしましたが\失敗しました。

正規表現がこの型の文字と一致するようにするにはどうすればよいですか?

編集する

出力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
    .

編集2:

出力locale

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

解決策

簡単に言えば、これがうまくいくことです。 3つの解決策がすべて機能しました。

  1. rename -nv $'s/a\xcc\x80/a/g' *
  2. PERL_UNICODE=AS rename -n 's/\pM//g' ./*。 (選択した回答の説明を参照)
  3. zsh代わりに、MacOSのデフォルトシェル()に切り替えると、元のbashコマンド(結合文字を指定しないなどa\u300)が機能しますrename -v 's/à/a/g' *

これらの回避策のうち満足できない場合は、選択した回答を確認して便利なヒントを見つけてください。

ベストアンサー1

macOSおよび少なくともHFS +ファイルシステムでは、アクセント文字は分解された形式でエンコードされているため、エンコードは次のようにàなりますa\u300a深刻なアクセントと組み合わせる 文字の組み合わせ)はさまざまなエラーを引き起こします(touch $'\ue0'およびaリヌス・トルバルドの有名な豪言状の一つ)疑似大文字と小文字を区別しないことをお勧めします。

これにより、次のことがわかります。

touch à; echo ?

1 文字のファイル名を一覧表示するには何も返しません。

echo ??

または

echo *a*

値を返しますà(実際には)。そして:

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

したがって、以下が必要です。

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

zsh(互換性のあるシェルを想定)。または、ksh93$'...'引用符はサポートされていますが、'はサポートされていないシェル(たとえば、zshmacOSの$'\u300'古代バージョン)に対して、U + 0300文字(0xcc 0x80)のUTF-8エンコーディングを手動で指定します。bash

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

または、perl次の\xcc\x80シーケンスを直接解釈します。

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

またはUnicode文字:

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

または、すべての結合文字を削除します。

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

そこで、私たちはperl考慮すべきパラメータASUTF-8でエンコードされるtdioストリーム(perldoc perlrunこのオプションと同等の環境変数の説明を参照)を指示し、ark Unicode属性(または省略形を参照)を持つすべての文字を削除するようにします指示します。詳細)$PERL_UNICODE-CMp\pM\p{Mark}\p{Combining_Mark}perldoc perluniprops

zsh以下でファイルを一覧表示できるはずです。

ls -d $'a\u300'

そして:

ls -d $'\ue0'

(大文字と小文字を区別しない$'A\u300' and possibly $'\uc0ためÀ)しかし:

ls -d *A*

以下以外のシェルzsh:

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

シェルは現在のディレクトリの内容をリストし、各ファイル名にパターンを適用し、ファイル名は一致しないものとしてエンコードされるため、一致しa\u300ません。

しかし、zshmacOSでのみシェルはアクセントを組み合わせてこれらの文字をreaddir()終えたiconv -f UTF-8-MAC -t UTF-8自己内部zreaddir()包装readdir()他の場所では機能しないaU+0300理由を説明する代わりに、U + 00E0を返します。echo *à*echo *a*

この変更は2014年6月にリリースされました。より詳細については、zshメーリングリストで説明してください。

問題の核心は、ユーザー入力に使用されるエンコーディングとファイルシステムにファイル名を保存(およびリスト)するために使用されるエンコーディングとの違いです。ほとんどすべてのキャラクターがあらかじめ組み立てられ分解された形をしている韓国語では問題がはるかに深刻です。これはzsh問題がもともと韓国人によって提起された理由を説明します。

だからzsh基本的に修理するファイルシステムではAppleの分解形式の選択が悪いので、完成とワイルドカードを使用できますが、残念ながらこれはそうでない場合にのみ機能し、それ以外の場合はまだzsh機能しません。ls | grep àfind . -name '*à*'

おすすめ記事