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

Ключом к производительности оболочки является минимизация количества дорогих системных вызовов, в частности fork() и exec().

Не используйте grep или sed внутри цикла shell. Никогда не используйте конвейер с обоими; в большинстве случаев его можно свести к sed или awk.

Если все усложняется, используйте язык, который может разбирать регулярные выражения, и делать циклы, например или .

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

При этом at&t ksh93 всегда был оптимизирован для скорости, в то время как bash и zsh имеют гораздо больше возможностей.

3
23.06.2016, 19:13
4 ответа

Используйте 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

6
27.01.2020, 21:08

Попробуйте следующее:

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

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

ls .*php*

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

ls .*php*cmd*echo*m3rg3*

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

6
27.01.2020, 21:08

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

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

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

1
27.01.2020, 21:08

find GNU или нет GNU

С GNU-версией find вы можете писать напрямую, не ища их inode,

find . -name '.<*' -delete

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

С версией, отличной от GNU, это тоже можно было сделать напрямую find. -name '. <*' -exec rm -i {} \; , который работает также с версией GNU, только примерно в 3 раза медленнее [ 1 ] , чем с -удаление .
Если файлов не слишком много, можно использовать и поиск. -name '. <*' -exec rm -i {} + , снова быстрее.

perl

Предполагается, что . <* в качестве ключа, который выбирает все и только файлы, которые вы хотите удалить (не без некоторого спортзала в строке)

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

Для удаления всех скрытых файлов каталога достаточно perl -e 'для (<'. * '>) {((stat) [9] <(unlink))}'

Это быстрее с большим количеством файлов. Проверьте выражение, потому что я обычно не работаю с perl.

Обходной путь

В общем, вы можете попробовать переместить все другие файлы в другой каталог и удалить исходный каталог.

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

Недостатки, если какой-то файл уже используется ... но бывают случаи, когда вы тоже можете его использовать .

Ps> не забудьте rsync to / dev / null с опцией -delete ...

0
27.01.2020, 21:08

Теги

Похожие вопросы