无法在Linux上删除带有奇怪名称/编码的文件

时间:2016-08-22 16:25:43

标签: linux bash encoding sh

我有一个在ls中显示为? ?的文件:

drwxr--r--    1 johndoe gid-johndoe  93756 Aug 22 09:10 .
drwxr--r--    1 johndoe gid-johndoe 574633 Aug 22 09:18 ..
-rw-r--r--    1 johndoe gid-johndoe 874857 Aug 12 15:25 ? ?
-rw-------    1 johndoe gid-johndoe  96342 Aug 22 08:41 .bash_history

当我尝试使用sed获取文件名时,我得到了这个奇怪的输出:

ls -la | sed 's/.*[0-9] //'

.
..

ash_history

我认为文件名必须有一个奇怪的编码,但我不知道如何获得'处理它'所以我可以打开/重命名/删除它。

如何获取此文件的句柄以打开/重命名/删除它?

修改

当我输入ls并按Tab键自动完成时,该文件显示为^[ ^[

3 个答案:

答案 0 :(得分:3)

感谢评论this link,我找到了解决方案:

  1. 运行ls -i以获取inode编号
  2. 运行find . -inum <inode> -ok rm '{}' \;,并使用'are you sure?'提示符删除inode编号。

答案 1 :(得分:-2)

$touch '? ?' '? ?' '^[ ^['; ls -A1
? ?
???
? ?

$rm -i "$(ls|grep -E -m1 '[?[:cntrl:]]')"
rm: remove regular empty file '\033 \033'? y

$rm -i "$(ls|grep -E -m1 '[?[:cntrl:]]')"
rm: remove regular empty file '?\t?'? y

$rm -i "$(ls|grep -E -m1 '[?[:cntrl:]]')"
rm: remove regular empty file '? ?'? y

$ls -A

一定要使用rm -i来验证匹配的文件 - 一次匹配一个 - 正则表达式匹配文字问号以及任何?显示为不可见的控制字符

测试 - 创建3个文件 - 用文字? - 两者之间的标签? - 使用ESC控制字符 - 使用CTRL-V在bash终端中键入控制字符

function StripHTML(strhtml)
{
   var tmpDiv = document.createElement("DIV");
   tmpDiv.innerHTML = strhtml;
   return tmpDiv.textContent || tmpDiv.innerText || "";
}

答案 2 :(得分:-3)

您应该尝试使用find和正则表达式。

 find . -name "*" -exec ls '{}' \;

找到测试:

➜  t1 touch \?
➜  t1 ll
total 8.0K
-rw-rw-r-- 1 netsamir netsamir 0 Aug 22 19:02 ?
➜  t1 find . -name "*" -exec rm {} \;
rm: cannot remove '.': Is a directory
➜  t1 ll
total 0
➜  t1 

另一个解决方案是:

➜  t1 touch "\? \?"
➜  t1 ll
total 8.0K
-rw-rw-r-- 1 netsamir netsamir 0 Aug 22 19:05 \? \?
➜  t1 rm "\? \?"   
➜  t1 ll
total 0
➜  t1