如何查找并删除文件名中带有回车符 (\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'

如何列出/查找并删除此类文件?加“?”文件名有效,所以我可以将它们一一删除,但我更喜欢一种更通用的方法。

注意:我尝试通过 Cygwin/git-bash/Linux 的 Windows 子系统在 Windows 上执行此操作,因此某些命令可能无法按预期工作。

答案1

它什么也没发现,因为-name测试需要 shell glob 而 glob 不知道\r。假设您的 Cygwin shell 支持$' '符号,您可以这样做:

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

相关内容