一つ?​ls

一つ?​ls

AIX 6.1で一部のファイルをコピー(バックアップ用)しようとすると、一部の非標準文字が原因で大きな問題が発生しました。私がしなければならないことは、ファイルを復元し、再び正常に動作できるように、バックアップアーカイブのファイル名がまったく同じになるようにすることです。

csvファイルから名前で(1行ずつ)名前を取得し、cpを使用してバックアップ先にコピーするkshスクリプトを作成しようとしています。スクリプトを実行した後、新しい場所にいくつかのファイルがありませんでした。いくつかの調査の終わりに、欠落しているファイルの元のディレクトリ名にいくつかの非標準文字(長い、アクセント記号など)が含まれていることがわかりました。

  1. コピーするファイルのリストを含むcsvファイルがあります。たとえば、長い「-」があります。
    cat file_list.csv | grep pattern /path/to/file/some–file_with_pattern

  2. cpを使用してこの特定のファイルをコピーしようとした場合(スクリプトを介してまたはcpを手動で実行してください):
    cp /path/to/file/some–file_with_pattern /new/backup/path cp: /path/to/file/some–file_with_pattern: No such file or directory

  3. lsを使用してファイルを表示するとき:
    ls /path/to/file | grep pattern some?file_with_pattern

したがって、AIXは「?」を含むファイルを表示します。 "-"の代わりにcpがエラーを発生させます。ワイルドカード(*または?)を使用してファイルをコピーすると、コピーされますが、ターゲットディレクトリに「-」の代わりに「?」が表示されます。ファイル名を""または""に入れると、ターゲットディレクトリの"-"の代わりに"?"が同じになります。別の名前( "-"の代わりに "?")でファイルを復元すると、そのファイルを使用しているアプリケーションがそのファイルを参照できないため、これは私のニーズに合いません。

kshとshを試しました(bashはサーバーでは利用できません)。ロケールを試しました(LC_ALL = "en_US.UTF-8"を設定してUTF8を強制的に適用)。 Puttyエンコーディング設定を試しました。それでも元の名前でファイルを参照できないため、元の名前を保持しながらファイルをコピーすることはできません。シェルコマンドを使用してこのファイルをコピーする方法を知っている人はいますか?

ベストアンサー1

ここで解決すべき3つの問題があります。

一つ?ls

lsファイル名に実際の文字を表示するのは正しくありません。

たとえば、次のファイル名には、ls次に置き換えることができる(常にそうではない)文字が含まれています?

$ eval "$(printf "a='\n' b=\032 c=–")"
$ touch test{"$a","$b","$c"}file
$ ls --quoting-style=literal test*
test?file  test?file  test–file

ただし、これは使用されません?(ファイルを一覧表示するシェルです):

$ echo test*
test
file testfile test–file

もちろん、文字を表示するには(エンコード)、次の手順を実行します。

$ echo test* | od -An -tc
   t   e   s   t  \n   f   i   l   e       t   e   s   t 032   f   i   l   e
   t   e   s   t 342 200 223   f   i   l   e  \n

odしたがって、ファイルで使用されている文字を実際に表示するには、このようなものを使用する必要があります。

$ touch 'some–file_with_pattern'
$ echo *pattern* | od -An -tc
   s   o   m   e 342 200 223   f   i   l   e   _   w   i   t   h   _   p   a   t   t   e   r   n  \n

コーディング

エンコーディングがutf-8に正しく設定されているため、上記のemダッシュは常に表示される文字として正しく表示されます(例とは対照的に)。?

したがって、翻訳でPuTTY設定を確認し、文字セットがUTF-8に設定されていることを確認してください。

その後、この行を試みると、このWebページに表示されているのと同じ文字が印刷されます。

$ echo 'áé€íìïîößđ₣λŕžç×  Москва  Ελληνικά'
áé€íìïîößđ₣λŕžç×  Москва  Ελληνικά

ファイルシステムのエンコード

上記の2つの問題は、ファイルシステムエンコーディングがロケールエンコーディングと一致しない場合、または関連する2つのファイルシステムが異なる場合を除き、99%のケースを解決する必要があります。

この問題を調査する前に、上記の2つの質問に問題がないことを確認してください。読むエンコードの問題により、同じファイルのファイル名が異なります。

おすすめ記事