Ключом к производительности оболочки является минимизация количества дорогих системных вызовов, в частности fork()
и exec()
.
Не используйте grep
или sed
внутри цикла shell. Никогда не используйте конвейер с обоими; в большинстве случаев его можно свести к sed
или awk
.
Если все усложняется, используйте язык, который может разбирать регулярные выражения, и делать циклы, например awk или perl.
С другой стороны, если вы можете обойтись простой обработкой текста, предлагаемой оболочкой, вы можете выжать из нее много производительности.
При этом at&t ksh93 всегда был оптимизирован для скорости, в то время как bash и zsh имеют гораздо больше возможностей.
Используйте 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
Попробуйте следующее:
rm -iv -- .\<\?php\ passthru\(\$_GET\[cmd\]\)\;echo\ m3rg3\;\?\>
А в будущем, когда у вас действительно странное имя файла, попробуйте использовать оболочку glob , например:
ls .*php*
должно быть хорошим началом. Если у вас есть много файлов с похожими именами файлов, просто используйте любую уникальную регулярную подстроку
ls .*php*cmd*echo*m3rg3*
И в конце вы можете нажать Tab , чтобы завершить имя файла, если используемая оболочка имеет механизм завершения.
rm
- умный зверь, вы можете использовать шаблоны glob
в аргументе
Для вашего случая достаточно простого rm. \ <*
* будьте осторожны при использовании rm
с шаблонами глобуса
, так как он удалит несколько файлов, соответствующих шаблону
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
...