有些文件的文件名末尾有“?”,我需要找到这样的文件

有些文件的文件名末尾有“?”,我需要找到这样的文件

我不知道这些文件是怎么产生的,但它看起来像这样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+ QCTRL+ 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 lsxargs -0 rm -f再次执行脚本以删除文件

相关内容