130文字以上の英語文字または43文字以上のアジア文字を含むディレクトリ内のすべてのファイルを見つけます。

130文字以上の英語文字または43文字以上のアジア文字を含むディレクトリ内のすべてのファイルを見つけます。

NASからファイルを転送しようとしましたが、「暗号化された共有フォルダのファイルまたはフォルダ名は、英語文字143文字またはアジア語(CJK)文字47文字を超えることはできません」というエラーが表示されます。一致するすべてのファイルを検索するコマンドシェルはありますか?この条件付き文書?

答え1

find path | grep -P '\/[^\/]{130,}[^\/]$'

stackoverflow.comのこのソースに基づいています。 Synology暗号化共有と比較して長すぎるファイルを見つける

フォルダ以外のファイルだけをキャプチャするために最後に$を追加しました。

たぶん、さまざまなUnicodeを使用するCJK文字を見つけることができます。私はgrepがこれを行うことができないと思います。おそらくウグレフ

答え2

UTF-8でエンコードすると、ファイル名が143文字を超えることはできないと言われているようです。バイト多くのアジア文字(意味は何でも)は3バイトのUTF-8でエンコードされていますが(48 x 3は144であることがわかります)、ほとんどの英語文字は1バイトにエンコードされているとします。

だからそれを見つけるには:

存在するzsh

set +o multibyte -o extendedglob
print -rC1 -- **/?(#c144,)(ND)

制限を超えた方のために

set +o multibyte -o extendedglob
print -rC1 -- **/?(#c1,143)(ND)

限度未満の場合。

そのタイプを見やすくする目次M、arkの場合、Mglob修飾子()を追加すると、ディレクトリにprint -rC1 -- **/?(#c144,)(NDM)aが追加されます。/

または以下を使用してfind

LC_ALL=C find . -name '????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????*'

限度を超える人々のため。

上記の時間は144?秒です。以下を使用してパターンを作成することもできます。

pattern=$(printf %145s '*' | tr ' ' '?')
LC_ALL=C find . ! -name "$pattern"

またはzsh:

pattern=${(l[145][?]):-*}

制限(143バイト以下で構成)未満のファイル名を取得するには、次のよう-nameに変更します。! -name

GNU実装を使用すると、find次のこともできます。

LC_ALL=C find . -regextype posix-extended -regex '.*/[^/]{144,}'

1 UTF-8エンコーディングは1〜4バイトの文字をエンコードします。元のアルゴリズムは、最大6バイトのコードポイントをU + 7FFFFFFまでエンコードするように設計されていましたが、Unicodeコードポイントは後でU + 10FFFFに制限されました。 -ASCIIセット(コードポイントU + 0000〜U + 007F)は1バイトにエンコードされます。 3バイトエンコーディングはU + 0800からU + FFFFまでです。

関連情報