web-dev-qa-db-ja.com

143文字を超えるファイル名を検索するコマンド?

最初に背景を説明します。Synologyで暗号化されていない共有フォルダを暗号化されたフォルダに変換しようとしていますNASこのエラーが表示されています:

Synology NAS Error

したがって、問題のあるファイルを見つけて、名前を変更できるようにしたいと思います。次のgrepコマンドを考え出しました:grep -rle '[^\ ]\{143,\}' *が、143文字を超えるパスを持つすべてのファイルを出力します。

#recycle/Music/TO SORT/music/H/Hooligans----Heroes of Hifi/Metalcore Promotions - Heroes of Hifi - 03 Sly Like a Megan Fox.mp3
...

私が望むのは、grepが/で分割してから検索を実行することです。これに対処するための効率的なコマンドに関するアイデアはありますか(ディレクトリには数十万のファイルが簡単に含まれます)?

6
Stunner

試してください:

find /your/path | grep -E '[^/]{143,}$'
8
Jim L.

GNU 'findutils-default' regular expression syntax{n,m}インターバル数量詞を提供しませんが、-regexテストを使用できますGNU find別のregextypeを選択した場合、例えば:

find . -regextype posix-extended -regex '.*/[^/]{143,}$'

または

find . -regextype egrep -regex '.*/[^/]{143,}$'

または

find . -regextype posix-basic -regex '.*/[^/]\{143,\}$'

エスケープの有無にかかわらず、{n,m}間隔をサポートする他のregextypesが存在する場合があります。

findの結果を別のgrepコマンドにパイプすることと比較すると、これは改行全体で一致します(つまり、find正規表現のフレーバーは、その.の名前とは異なります)デフォルトでは改行文字に一致します)。

11
steeldriver

すでにlocate dbを持っているなら、これは非常に高速です。

locate --regex '.*/[^/]{143,}$'
5
Andrew Domaszek