Ускорение случайной сортировки и удаления (rm) для нескольких каталогов

Por lo que yo sé, no existe una forma garantizada de determinar la asignación de números de llamadas del sistema a nombres de llamadas del sistema desde un kernel en ejecución. Encontrar la llamada correspondiente a un número de llamada del sistema siempre implica buscar en el código fuente...

Los desarrolladores de software que necesitan realizar este tipo de mapeo tienden a mantener sus propias listas de llamadas al sistema; este es el enfoque utilizado porstrace. Significa que cualquier versión dada de dichos programas puede estar desactualizada en comparación con cualquier kernel dado,aunque en la práctica las llamadas al sistema se agregan con la suficiente lentitud para que esto no sea un gran problema.

Incluso buscar valores en el código fuente del kernel es complicado, porque las asignaciones se almacenan de diferentes maneras según la arquitectura. Incluso en arquitecturas donde el mapeo es "simple", como x86 con sus tablas de llamadas al sistema , encontrar la llamada para un número determinado puede implicar múltiples búsquedas en varios lugares.

Una forma rápida y confiable de encontrar las asignaciones para un sistema, siempre que tenga GCC y los encabezados del sistema, es usar este último. Por ejemplo,

awk 'BEGIN { print "#include " } /p_syscall_meta/ { syscall = substr($NF, 19); printf "syscalls[SYS_%s] = \"%s\";\n", syscall, syscall }' /proc/kallsyms |
sort -u | gcc -E -P - | less

extrae la lista de llamadas del sistema Linux de /proc/kallsyms, crea un fragmento de código C (o, más bien, código de procesador C pre -)y lo alimenta a través del procesador pre -, produciendo algo me gusta

syscalls[288] = "accept4";
syscalls[43] = "accept";
syscalls[21] = "access";
syscalls[163] = "acct";
syscalls[248] = "add_key";

etc. Puede usar banderas GCC para modificar la arquitectura para que coincida con el kernel si es necesario(p.-m32para ver los números de llamada del sistema i386, o -mx32para x86 -32 números ).

En su caso, 345 es el número para la llamada al sistema sendmmsgen i386, y no corresponde a nada en x86 -64 o x86 -32. Se introdujo en 2011, alrededor del 2.6.39, por lo que cualquier sistema que use el antiguo -2.6.32 como base para su kernel y programas relacionados no lo conocería (, por lo que podría ver esto con un stracede época similar, y un núcleo más nuevo ).

1
01.06.2019, 06:32
1 ответ

Проверив связанный исходный пост, похоже, что ваша петля на самом деле должна быть:

for d in */; do find "$d" -iname '*.jpg' -type f -print0 | sort -zR | tail -zn +50001 | xargs -0r rm; done

Для запуска из каталога master.

Опции -zдля sortи tailнеобходимы, поскольку входные данные ограничены нулем -. Ни один из них не будет жаловаться, если строк меньше 50000.-sortвсе равно, и tailничего не выведет, так как после 50000-й строки ничего нет. rmможет пожаловаться на то, что он запускается без аргументов, но опция -rдля GNU xargsпредотвратит его запуск rm, если он не получит входных данных (BSD xargs не нуждается в этом, но, вероятно, выиграл не жалуюсь ).

И наконец, что наиболее важно, опция -zдля ввода с нулевым -разделителем, вероятно, не будет поддерживаться хвостом BSD. Вам понадобится хвост GNU, который можно установить с помощью доморощенного.

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

for d in */; do find "$d" -type f | sort -R | tail -n +50001 | xargs rm; done
1
27.01.2020, 23:41

Теги

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