Удалить файл с именем, содержащим недопустимые символы.

Удалить файл с именем, содержащим недопустимые символы.

В /tmpкаталоге у меня есть файл с таким именем:

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

Я не могу удалить этот файл обычными способами и пробовал закавычить его имя, но безрезультатно.

Что мне следует попробовать дальше?

решение1

Используйте ls -li, чтобы увидеть inode, затем удалите inode с помощью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\;\?\>

И на будущее, если у вас действительно странное имя файла, попробуйте использовать оболочкушармеханизм, например:

ls .*php*

должно быть хорошим началом. Если у вас много файлов с похожими именами, просто используйте любую уникальную обычную подстроку

ls .*php*cmd*echo*m3rg3*

И в конце вы можете нажать , Tabчтобы завершить имя файла, если используемая вами оболочка поддерживает механизм завершения.

решение3

rmумный зверь, можно использовать glob patternsв аргументе

rm .\<*Для вашего случая достаточно простого

*будьте осторожны при использовании rmwith, 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...

Связанный контент