10

私は OS X で Web サイト開発を行っていますが、ライブ Web サイト (Linux/LAMP を実行) の一部を自分のマシンで実行されている開発サーバーに移動することがよくあります。そのような例の 1 つは、イメージ (ユーザーが生成したコンテンツ、たとえば ftp ダウンロードを介して) をダウンロードし、それらを何らかの方法で処理して、生産サイトに戻すことです。

関連する画像ファイルは Linux マシンで作成されており、ファイル名は NFC 分解を使用して UTF-8 でエンコードされているようです。一方、OS X の HFS+ ファイル システムは、NFC で分解されたファイル名を許可せず、NFD に変換します。ただし、完了してファイルをアップロードしたい場合、Linuxは両方をサポートしているため、ファイルの名前はNFD分解を使用するようになります。その結果、新しくアップロードされた (場合によっては置き換えられた) ファイルは、予期された URL でアクセスできなくなります。

転送中 (できれば) または転送後にファイルの UTF 分解を変更する方法を探しています (convmv良いオプションのように見えますが、このサーバーに十分な権限がないため、この特定のケースでは不可能です)。事前にやるのは無理だと思います。Transmit と rsync (通常使用するデプロイ スクリプトを使用) を使用して FTP アップロードを試みましたが、役に立ちませんでした。rsyncの--iconvオプションは理想的に思えましたが、残念ながら、rsync 2.6.9 を実行しているサーバーはそれを認識しませんでした。

かなりの数の人が同様の問題を抱えていると思います。解決策や回避策を聞いてうれしいです!

更新:この場合、Ubuntuを実行している仮想マシンにファイルを再同期し、そこでconvmvを実行してから、ステージングサーバーに再度再同期しました。これはかなりうまく機能しますが、少し時間がかかります。おそらく、OS X に ext ファイル システムをマウントし、元の NFC で分解されたファイル名を使用して、代わりにそこにファイルを保存することは可能でしょうか?

また、私のユースケースである将来のWordPressインストールでこの問題をすべて一緒に回避するには、ファイルをアップロードするadd_filter('sanitize_file_name', 'remove_accents'); 前に単純なものを追加できます。

4

2 に答える 2

6

rsync --iconvファイルの転送と名前のトランスコードをすべて 1 つのステップで実行できるため、これが最適なソリューションのようです。ホストに rsync をアップグレードするよう説得するだけです。この機能が 2008 年にリリースされた rsync 3.0.0 で導入されたことを考えると、--iconvホストがまだ rsync 2.6.9 を実行しているのは少し奇妙です。

ホストに最新の rsync をインストールするよう説得できない場合は、独自の rsync をコンパイル~/binし、サーバーなどの場所にアップロードして、システムが rsync をインストールする前にそれをパスに追加することができます。その後、オプションを使用できるようになり--iconvます。これは、rsync デーモンではなく、SSH (デフォルト) 経由で rsync を使用している限り機能します。SSH 経由の rsync は、リモート マシンに SSH 接続しrsync --server、ローカル rsync に渡したのと同じオプションで実行することによって機能するためです。

または、最新のツールと Perl がインストールされているホストを見つけることもできます。

于 2012-10-02T22:16:54.967 に答える
5

現在、私はrsync --iconvこのように使用しています:

与えられた Linux サーバーと OS X マシン:

サーバーからマシンへのファイルのコピー

サーバーからこのコマンドを実行する必要があります(OS X からは機能しません)。

rsync --iconv=UTF-8,UTF-8-MAC /home/username/path/on/server/ 'username@your.ip.address.here:/Users/username/path/on/machine/'

マシンからサーバーへのファイルのコピー

次のコマンドを machine から実行する必要があります。

rsync --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ 'username@server.ip.address.here:/home/username/path/on/server/'
于 2014-09-10T14:10:54.027 に答える