Regular-Expression

如何查找和刪除文件名中帶有輸入符 (r) 的文件?

  • October 2, 2020

不知何故,我似乎生成了文件名中帶有輸入符 (\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/Windows Subsystem for Linux 在 Windows 上執行此操作,因此可能某些命令無法按預期工作。

它什麼也沒找到,因為-name測試需要一個 shell glob 而 glob don’t know \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

引用自:https://unix.stackexchange.com/questions/612508