Поиск в ПУТИ для команд, запускающихся с конкретной буквы

Заголовок линии [11895648] [11895648] говорит, что это сообщения произошло примерно через 5 секунд после предыдущего, это не говорит о том, что монтаж, сам по себе взял это долго; Промежуточные, просеивание событий, возможно, произошедшие между ними (как известно в комментарии Celada).

На недавней багажнике Pi Rasperry я вижу:

[    2.474306] EXT4-fs (mmcblk0p2): couldn't mount as ext3 due to feature incompatibilities
[    2.485611] EXT4-fs (mmcblk0p2): couldn't mount as ext2 due to feature incompatibilities

(More lines, none related to this device.)

[    3.329574] EXT4-fs (mmcblk0p2): recovery complete
[    3.337860] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)

, который дает оценку продолжительности монтажа от 8 мс и 864 мс, в зависимости от того, в зависимости от того, какое сообщение, которое вы предполагаете, указывает на попытку монтажа, в том числе какое-то время для восстановления (предположительно, потому что Файловая система была помечена грязной).

-121--93147-

Это бессмысленно объединяться -N и -U .

Использование -N Если вы никогда не хотите перезаписать существующий файл.

Использование -U Если вы не хотите перезаписать новые файлы.

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

Я ожидаю, что -N -N более эффективно, чем -U , но эффект вряд ли будет на всех измеримых.

(В вышеупомянутом, «старше», «новее» и т. Д. - все с точки зрения mime файлов.

-22
10.12.2019, 19:19
2 ответа

Вам в основном нужно пройти через все каталоги, перечисленные в PATH , и запустить find для поиска шаблона , в данном случае двоичные файлы, начинающиеся с буквы 'g' . Просто запустите:

for i in $(echo $PATH | tr ":" "\n")
do
  find ${i} -iname "g*" 2> /dev/null
done

Важно отметить, что в некоторых каталогах может не быть ни одного файла, соответствующего регулярному выражению, поэтому вы должны отбросить вывод ошибки с помощью 2> / dev / null .

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

0
28.01.2020, 05:21

Hay un solo comando simple que podría usar para hacer esto en bash, pero probablemente viola el requisito de "no usar bashfinalización". No obstante, he incluido esto al final de esta respuesta. En cambio, usaré un par de bucles para resolver esto.

Suponiendo que desee encontrar todos los comandos externos ejecutables que comiencen con la letra gen cualquiera de los directorios enumerados en su$PATH:

#!/bin/sh

IFS=:; set -f; set -- $PATH; set +f
for dirpath do
    for pathname in "$dirpath"/g*; do
        if [ -x "$pathname" ]; then
            printf 'Executable: %s (%s)\n' "${pathname##*/}" "$pathname"
        fi
    done
done

Esto primero establece los parámetros posicionales en la lista de directorios contenidos en su variable PATH. Hace esto configurando IFSa :. Esto significa que cuando usamos $PATHsin comillas, su valor se dividirá en los:-caracteres de la cadena. Para usar la variable sin comillas de forma segura, también usamos set -fpara desactivar temporalmente el globbing, en caso de que alguna parte de la cadena pueda interpretarse como un patrón de globbing de nombre de archivo. Habilitamos el globbing nuevamente con set +fporque lo necesitamos más adelante.

Una vez que hemos establecido los parámetros posicionales en la lista de rutas de directorio, iteramos sobre estos. En cada iteración, obtenemos los nombres de ruta de cualquier archivo que comience con la letra gen ese directorio y probamos cada uno para ver si 1 )existe y 2 )es ejecutable (el -xtest hace ambas cosas ). Si es ejecutable, mostramos su nombre y su ruta completa.

Tenga en cuenta que esto restringe la pregunta para cubrir solo los comandos ejecutables externos en el $PATHactual. No encontrará alias ni funciones de shell. Tampoco se tendrán en cuenta las utilidades que solo están disponibles como incorporadas -en las utilidades.

Con un shell que entiende ${variable//pattern/word}para reemplazar un patrón con una cadena en cualquier parte del valor de una variable, y con un findque sabe -maxdepthy-executable(felicitaciones a isaac por mencionar este enfoque en otros lugares):

(
    set -f
    find -H -- ${PATH//:/ } -maxdepth 1 -type f -name 'g*' -executable
)

Esto desactivaría el globbing para el comando find, luego buscaría en cada uno de los directorios enumerados en $PATHcualquier nombre que comience con gque corresponda a un archivo ejecutable. Esto sería ejecutable solo por el usuario actual. Use -perm -o+xen lugar de -executablepara probar si el bit ejecutable está configurado para "otros".

La ​​opción -Hpara findhará que resuelva los enlaces simbólicos proporcionados en la línea de comando (, es decir, las rutas de búsqueda ), pero no las encontradas al atravesar las rutas.


Lo anterior era una solución genérica /bin/sh. Si se le permite usar comandos especiales bash, puede generar una lista de todos los comandos externos, funciones de shell y alias, que comienzan con la letra gcon

compgen -c g

Para incluir -incorporado en los comandos, use

compgen -bc g

... pero esto puede contar como "usar bashfinalización".

El compgenconstruido -en el mando está documentado en el manual bash(1).

0
28.01.2020, 05:21

Теги

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