「à」文字を含むファイルの名前を変更しようとしています。
私は次のことを行います。
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つの解決策がすべて機能しました。
rename -nv $'s/a\xcc\x80/a/g' *
PERL_UNICODE=AS rename -n 's/\pM//g' ./*
。 (選択した回答の説明を参照)zsh
代わりに、MacOSのデフォルトシェル()に切り替えると、元のbash
コマンド(結合文字を指定しないなどa\u300
)が機能しますrename -v 's/à/a/g' *
。
これらの回避策のうち満足できない場合は、選択した回答を確認して便利なヒントを見つけてください。
ベストアンサー1
macOSおよび少なくともHFS +ファイルシステムでは、アクセント文字は分解された形式でエンコードされているため、エンコードは次のようにà
なりますa\u300
。a
深刻なアクセントと組み合わせる 文字の組み合わせ)はさまざまなエラーを引き起こします(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$'...'
引用符はサポートされていますが、'はサポートされていないシェル(たとえば、zsh
macOSの$'\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
考慮すべきパラメータA
とS
UTF-8でエンコードされるtdioストリーム(perldoc perlrun
このオプションと同等の環境変数の説明を参照)を指示し、ark Unicode属性(または省略形を参照)を持つすべての文字を削除するようにします指示します。詳細)$PERL_UNICODE
-C
M
p
\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
ません。
しかし、zsh
macOSでのみシェルはアクセントを組み合わせてこれらの文字を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 '*à*'