ファイル名にキャリッジリターン(\ r)を含むファイルを検索して削除するにはどうすればよいですか?

ファイル名にキャリッジリターン(\ r)を含むファイルを検索して削除するにはどうすればよいですか?

なぜかファイル名にキャリッジリターン(\ r)を含むファイルを生成するようです。

$ ls -1 tri-rods.tm.dat*
tri-rods.tm.dat
'tri-rods.tm.dat'$'\r'
$ ls tri-rods.tm.dat?
'tri-rods.tm.dat'$'\r'

「\r」で検索しようとしましたが、何も見つかりませんでした。

$ find . -type f -name '*\r'

そのようなファイルをどのようにリスト/検索して削除できますか?ファイル名に "?"を追加すると、1つずつ削除できますが、より一般的なアプローチを好みます。

注:Windowsでは、Cygwin / git-bash / Linux用のWindowsサブシステムを介してこれを実行しようとしているため、一部のコマンドが期待どおりに機能しない可能性があります。

答え1

-nameテストにはシェルグロブが必要で、グロブはこれについて知らないため、何も見つかりませんでした\r。 Cygwinシェルがシンボルを$' 'サポートしていると仮定すると、次のことができます。

find . -name '*'$'\r''*'

したがって、削除するには、次のことができます。

find . -name '*'$'\r''*' -delete

または、find対応する操作がない場合は、-delete次を使用します。

find . -name '*'$'\r''*' -exec rm {} +

この-regexテストは最良の選択肢のようですが、残念ながら正規表現スタイルのどれもfindバックスラッシュ文字エスケープの理解をサポートしていません(この回答):

$ find . -regextype findutils-default -regex '.*\r.*'
$ find . -regextype ed -regex '.*\r.*'
$ find . -regextype emacs -regex '.*\r.*'
$ find . -regextype gnu-awk -regex '.*\r.*'
$ find . -regextype grep -regex '.*\r.*'
$ find . -regextype posix-awk -regex '.*\r.*'
$ find . -regextype awk -regex '.*\r.*'
$ find . -regextype posix-basic -regex '.*\r.*'
$ find . -regextype posix-egrep -regex '.*\r.*'
$ find . -regextype egrep -regex '.*\r.*'
$ find . -regextype posix-extended -regex '.*\r.*'
$ find . -regextype posix-minimal-basic -regex '.*\r.*'
$ find . -regextype sed -regex '.*\r.*'

最初のものだけが$'\r'私のために働いた。

$ find . -name '*'$'\r''*'
./bad?file

関連情報