删除文件名包含不允许的字符的文件

删除文件名包含不允许的字符的文件

/tmp目录中我有具有以下文件名的文件:

.<?php passthru($_GET['cmd']);echo 'm3rg3';?>

我无法通过正常方式删除此文件,并尝试引用此文件名但没有结果。

接下来我应该尝试什么?

答案1

ls -li用于查看索引节点,然后使用删除索引节点find

[root@server tmp]# ls -li .\<*
16163346 -rw-r--r-- 1 root root 0 Jun 23 12:02 .<?php  passthru($_GET[cmd]);echo 
[root@server tmp]# find . -inum 16163346 -exec rm -i {} \;
rm: remove regular empty file `./.<?php passthru($_GET[cmd]);echo'? y

参考:http://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

答案2

尝试这个:

rm -iv -- .\<\?php\ passthru\(\$_GET\[cmd\]\)\;echo\ m3rg3\;\?\>

将来,当你有非常奇怪的文件名时,尝试使用 shell全局机制,例如:

ls .*php*

应该是一个好的开始。如果您有许多具有相似文件名的文件,则只需使用任何唯一的常规子字符串

ls .*php*cmd*echo*m3rg3*

最后,Tab如果您使用的 shell 具有完成机制,则可以点击完成文件名。

答案3

rmglob patterns是一个聪明的野兽,你可以在论证中 使用

对于您的情况,简单rm .\<*就足够了

rm*使用with时要小心glob patterns,因为它会删除与模式匹配的多个文件

答案4

findGNU 或非 GNU

使用GNU版本find你可以直接写入,而不需要寻找它们的inode,

find . -name '.<*' -delete

当然,总是建议在没有该-delete选项的情况下尝试并检查要删除的文件的名称。

对于非 GNU 版本,也可以直接完成,find . -name '.<*' -exec rm -i {} \;也适用于 GNU 版本,仅慢大约 3 倍[1]然后与-delete.
当文件不是太多时,您也可以使用find . -name '.<*' -exec rm -i {} +,同样更快。

perl

假设 .<*作为键选择所有且仅选择要删除的文件(并非没有一些健身房在绳子上)

perl -e 'for(<'.'\<'*'>){((stat)[9]<(unlink))}'

删除该目录的所有隐藏文件就足够了perl -e 'for(<'.*'>){((stat)[9]<(unlink))}'

文件较多时速度更快。检查表达式,因为我通常不使用 perl。

解决方法

一般来说,您可以尝试将所有其他文件移动到另一个目录中并删除原始目录

mv /tmp /tmp2; mkdir tmp; mv /tmp2/* /tmp; rm tmp2

如果某些文件正在使用,则会有缺点...但在某些情况下您也可以使用它。

Ps> 不要忘记rsync使用/dev/null选项-delete...

相关内容