我不知道这些文件是怎么产生的,但它看起来像这样ls -lh
:
total 8.1G
-rw-r--r-- 1 root root 1.6G Apr 13 2022 test_some_data_S6_R2.fastq.gz?
-rw-r--r-- 1 root root 1.5G Apr 13 2022 test_some_data_S6_R1.fastq.gz
当我使用 ls 让文件名自动完成时,它看起来像这样 -
ls /path/to/file/test_some_data_S6_R2.fastq.gz^M
^M
在 DOS 中应该是载波返回,所以我猜测,有人可能从 Windows 系统中复制了该名称,并用它来命名文件。有很多方法可以替换文件的内容,但在我的例子中,我想查找名称中^M
包含的文件。^M
我试过了find /path/with/files/ -iname "^M"
,但没成功。我尝试用 逃脱\
,但还是没成功。我正在 SSH 进入红帽企业版机器使用 MobaXTerm,所以我尝试了 Windows 快捷键CTRL+ Q、CTRL+ M,但它隐藏了当前工作窗口,并且没有插入^M
。
答案1
在 bash 中,您可以使用$'\r'
插入^M
控制字符。
find /path/with/files -name '*'$'\r'
iname
不需要,因为 glob 表达式不包含任何字母- 必须添加星号以匹配
^M
我甚至可以^M
通过 组合键直接进入 bash 命令行Ctrl + v Ctrl + m。实际的键可能取决于bind
及其分配quoted-insert
。
find /path/with/files -name '*^M'
答案2
以下是该方法的一个小变化@choroba 在他们的回答中发布了。
在文本编辑器中创建一个小脚本(此处称为 myscript),如下所示
#!/bin/bash
find . -name "*^M" -print0 | xargs -0 ls
这里唯一的技巧是您需要逐字插入字符^M
,并且根据文本编辑器的不同,有特殊的技巧可以做到这一点。在 vi 或 vim 中是ctrl- K。在 emacs 中是ctrl- Q。使用所需的任何内容。
然后使脚本可执行:
chmod 755 myscript
然后执行脚本./myscript
。它应该只列出以字符结尾的文件^M
。如果它符合您的要求,请将 更改为xargs -0 ls
并xargs -0 rm -f
再次执行脚本以删除文件