![删除文件名包含不允许的字符的文件](https://linux22.com/image/89202/%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E5%90%8D%E5%8C%85%E5%90%AB%E4%B8%8D%E5%85%81%E8%AE%B8%E7%9A%84%E5%AD%97%E7%AC%A6%E7%9A%84%E6%96%87%E4%BB%B6.png)
在/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
rm
glob patterns
是一个聪明的野兽,你可以在论证中 使用
对于您的情况,简单rm .\<*
就足够了
rm
*使用with时要小心glob patterns
,因为它会删除与模式匹配的多个文件
答案4
find
GNU 或非 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
...