Regular-Expression
如何查找和刪除文件名中帶有輸入符 (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/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