$'\374'、$'\344'などを適切な分音符に置き換えます。

$'\374'、$'\344'などを適切な分音符に置き換えます。

2日間の研究の終わりに、ここの専門家に尋ねるしかありませんでした。

自宅の最初のDebianサーバーでNFS共有を設定しました。 Windows 11コンピュータからいくつかのファイルをコピーしたところ、すべての分音符がめちゃくちゃになりました。これで、影響を受けたすべてのファイルを検索し、無効な文字を正しい文字に置き換える方法を探しています。

詳細は次のとおりです。

SSHを介してシステムにアクセスすると、ロケールは次のように表示されます。

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

ファイルは次のようになります。

-rwxrwx---  1 someuser somegroup 309424046 Jul  5  2018 'Star Trek - Deep Space Nine - S07E23 - Extreme Ma'$'\337''nahmen - SDTV.mkv'
-rwxrwx---  1 someuser somegroup      1149 Jun  5  2021 'Star Trek - Deep Space Nine - S07E23 - Extreme Ma'$'\337''nahmen - SDTV.nfo'
-rwxrwx---  1 someuser somegroup     14468 Jul  9  2018 'Star Trek - Deep Space Nine - S07E23 - Extreme Ma'$'\337''nahmen - SDTV-thumb.jpg'
-rwxrwx---  1 someuser somegroup 328043411 Jul  5  2018 'Star Trek - Deep Space Nine - S07E24 - In den Wirren des Krieges - SDTV.mkv'
-rwxrwx---  1 someuser somegroup      1506 Jun  5  2021 'Star Trek - Deep Space Nine - S07E24 - In den Wirren des Krieges - SDTV.nfo'
-rwxrwx---  1 someuser somegroup     17538 Jul  9  2018 'Star Trek - Deep Space Nine - S07E24 - In den Wirren des Krieges - SDTV-thumb.jpg'
-rwxrwx---  1 someuser somegroup 703251173 Jul  5  2018 'Star Trek - Deep Space Nine - S07E25-E26 - Das, was Du zur'$'\374''ckl'$'\344''sst - SDTV.mkv'
-rwxrwx---  1 someuser somegroup      3089 Jun  5  2021 'Star Trek - Deep Space Nine - S07E25-E26 - Das, was Du zur'$'\374''ckl'$'\344''sst - SDTV.nfo'
-rwxrwx---  1 someuser somegroup     10441 Jul  9  2018 'Star Trek - Deep Space Nine - S07E25-E26 - Das, was Du zur'$'\374''ckl'$'\344''sst - SDTV-thumb.jpg'

ディレクトリのいずれかに直接ある場合、次のコマンドは期待どおりに機能します。

for x in *$'\374'*; do echo "$x" "${x//$'\374'/ü}"; done

問題は、ディレクトリツリー全体で影響を受けるすべてのファイルとディレクトリに対してこれを行う方法があり、すべての特殊文字に対して同時に実行できるかどうかです。それとも、この出来事を解決する方法をよく知っている人はいますか?

私は追加のツールがインストールされていないシステムで作業する方法を学びたいので、標準のツールセットを含むソリューションを好みます。

ベストアンサー1

試してみてください真珠 rename8進文字エンコーディングを正しいUnicode(または他の文字)に簡単に置き換えることができるコマンドです。より良いことは、Perlにはlatin1(および他の文字セット)とUnicodeを翻訳するための強力なUnicode機能があることです。

注:Perlは、、、またはとrenameも呼ばれます。機能とコマンドラインオプションが完全に異なり、互換性のないユーティリティと混同しないでください。 Perlを使用すると、ランダムに複雑なPerlコードを使用してファイルの名前を変更できますが、ファイル名に対して単純で類似した操作を実行するために最も一般的に使用されます。file-renameperl-renameprenamerenameutil-linuxrenameseds/search/replace/

renameDebian はパッケージにあります。

次の行はPerlrenameです。Unicode::Map8モジュール(debianにパッケージされているlibunicode-map8-perl)は、これらのlatin1エンコーディング文字の名前を対応するUnicode utf-8文字に置き換えます。

要求されたüとäウムラウトだけでなく、ßeszett ...と正しいutf8形式にマッピングされる可能性がある他の文字も変更します。

注意して使用してください。私がよくする唯一の言語は英語です。私が高校で学んだドイツ語コースは約40年前で、大学言語学とヒンディー語コースは約30年前でした。これはAFAICTで動作しますが、専門家からは遠いです。

$ rename -n 'BEGIN {
               use Unicode::Map8;
               our $l1_map = Unicode::Map8->new("latin1")
             };

             our $l1_map;
             $_ = $l1_map->tou($_)->utf8' Star\ Trek\ *
rename(Star Trek - Deep Space Nine - S07E23 - Extreme Manahmen - SDTV.mkv, Star Trek - Deep Space Nine - S07E23 - Extreme Maßnahmen - SDTV.mkv)
rename(Star Trek - Deep Space Nine - S07E23 - Extreme Manahmen - SDTV.nfo, Star Trek - Deep Space Nine - S07E23 - Extreme Maßnahmen - SDTV.nfo)
rename(Star Trek - Deep Space Nine - S07E23 - Extreme Manahmen - SDTV-thumb.jpg, Star Trek - Deep Space Nine - S07E23 - Extreme Maßnahmen - SDTV-thumb.jpg)
rename(Star Trek - Deep Space Nine - S07E25-E26 - Das, was Du zurcklsst - SDTV.mkv, Star Trek - Deep Space Nine - S07E25-E26 - Das, was Du zurücklässt - SDTV.mkv)
rename(Star Trek - Deep Space Nine - S07E25-E26 - Das, was Du zurcklsst - SDTV.nfo, Star Trek - Deep Space Nine - S07E25-E26 - Das, was Du zurücklässt - SDTV.nfo)
rename(Star Trek - Deep Space Nine - S07E25-E26 - Das, was Du zurcklsst - SDTV-thumb.jpg, Star Trek - Deep Space Nine - S07E25-E26 - Das, was Du zurücklässt - SDTV-thumb.jpg)

この-nオプションはテスト的に実行されるため、実際にファイル名を変更せずに実行するアクションのみが表示されます。要件を満たしていることが確認されたら、削除または置換して-n詳細な出力を取得します。-v

サブディレクトリツリーで再帰的に使用するには、次のように組み合わせますfind

find /path/to/directory -type f -print0 |
  rename -n -0 '
     BEGIN {
       use Unicode::Map8;
       our $l1_map = Unicode::Map8->new("latin1")
     };

     our $l1_map;
     $_ = $l1_map->tou($_)->utf8'

ところで、テスト目的でls -lディレクトリリストをスクリプトに変換して名前を変更するためのダミーファイルを作成しました。

touch 'Star Trek - Deep Space Nine - S07E23 - Extreme Ma'$'\337''nahmen - SDTV.mkv'
touch 'Star Trek - Deep Space Nine - S07E23 - Extreme Ma'$'\337''nahmen - SDTV.nfo'
touch 'Star Trek - Deep Space Nine - S07E23 - Extreme Ma'$'\337''nahmen - SDTV-thumb.jpg'
touch 'Star Trek - Deep Space Nine - S07E24 - In den Wirren des Krieges - SDTV.mkv'
touch 'Star Trek - Deep Space Nine - S07E24 - In den Wirren des Krieges - SDTV.nfo'
touch 'Star Trek - Deep Space Nine - S07E24 - In den Wirren des Krieges - SDTV-thumb.jpg'
touch 'Star Trek - Deep Space Nine - S07E25-E26 - Das, was Du zur'$'\374''ckl'$'\344''sst - SDTV.mkv'
touch 'Star Trek - Deep Space Nine - S07E25-E26 - Das, was Du zur'$'\374''ckl'$'\344''sst - SDTV.nfo'
touch 'Star Trek - Deep Space Nine - S07E25-E26 - Das, was Du zur'$'\374''ckl'$'\344''sst - SDTV-thumb.jpg'

おすすめ記事