LXDE и слияние LXQt - что в итоге?

Почему цикл вывода find - плохая практика?

Простой ответ:

Поскольку имена файлов могут содержать любой символ.

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


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

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

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

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


Давайте будем более конкретными: в системе UNIX или Linux имена файлов могут содержать любой символ, кроме / (который используется в качестве разделителя компонентов пути), и они не могут содержать нулевой байт.

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


Поскольку GNU find включает первичный элемент -print0 , который будет использовать нулевой байт для ограничения имен файлов, которые он печатает, GNU find можно безопасно используется с GNU xargs и его флагом -0 (и флагом -r ) для обработки вывода find :

find ... -print0 | xargs -r0 ...

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

  1. Он добавляет зависимость от GNU findutils, которой нет необходимости, а
  2. find - это разработан , чтобы иметь возможность запускать команды для найденных файлов.

Кроме того, GNU xargs требует -0 и -r , тогда как FreeBSD xargs требует только -0 ] (и не имеет опции -r ), а некоторые xargs вообще не поддерживают -0 . Так что лучше всего придерживаться функций POSIX find (см. Следующий раздел) и пропускать xargs .

Что касается пункта 2 - способность find запускать команды в найденных файлах - я думаю, что Майк Лукидес сказал это лучше всего:

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

- Unix Power Tools


В POSIX указано использование find

Как правильно запускать одну или несколько команд для каждого из результатов find ?

Чтобы запустите одну команду для каждого найденного файла, используйте:

find dirname ... -exec somecommand {} \;

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

find dirname ... -exec somecommand {} \; -exec someothercommand {} \;

Чтобы запустить одну команду на несколько файлов одновременно:

find dirname ... -exec somecommand {} +

найти в сочетании с sh

Если вам нужно использовать в команде функции оболочки , такие как перенаправление вывода или удаление расширения из filename или что-то подобное, вы можете использовать конструкцию sh -c . Вы должны знать несколько вещей об этом:

  • Никогда не вставляйте {} непосредственно в код sh . Это позволяет выполнять произвольный код из злонамеренно созданных имен файлов. Кроме того, на самом деле в POSIX даже не указано, что он вообще будет работать. (См. Следующий пункт.)

  • Не используйте {} несколько раз,или используйте его как часть более длинного спора. Это не переносится. Например, не делайте этого:

    find ... -exec cp {} somedir / {}. Bak \;

    Процитируем спецификации POSIX для find :

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

    ... Если присутствует более одного аргумента, содержащего два символа "{}", поведение не определено.

  • Аргументы, следующие за командной строкой оболочки, переданной в параметр -c , устанавливаются в позиционные параметры оболочки, начиная с $ 0 . Не начиная с $ 1 .

    По этой причине рекомендуется включить фиктивное значение $ 0 , например find-sh , которое будет использоваться для сообщения об ошибках из порожденной оболочки. Кроме того, это позволяет использовать такие конструкции, как «$ @» при передаче нескольких файлов в оболочку, тогда как отсутствие значения для $ 0 будет означать, что первый переданный файл будет установлен в $ 0 и поэтому не включается в «$ @» .


Чтобы запустить одну команду оболочки для каждого файла, используйте:

find dirname ... -exec sh -c 'somecommandwith "$1"' find-sh {} \;

Однако обычно это дает лучшую производительность для обработки файлов в цикле оболочки, так что вы не создаете оболочку для каждого найденного файла:

find dirname ... -exec sh -c 'for f do somecommandwith "$f"; done' find-sh {} +

(Обратите внимание, что для f do эквивалентно для f в «$ @»; do и обрабатывает каждый из позиционных параметров по очереди - другими словами, он использует каждый из файлов найдено с помощью find , независимо от каких-либо специальных символов в их именах.)


Дополнительные примеры правильного использования find :

(Примечание: не стесняйтесь расширять этот список.)

2
18.06.2017, 02:37
1 ответ

Афайк, разработчики по-прежнему поддерживают и LXDE, и LXQt, и будут продолжать поддерживать LXDE. на обозримое будущее. Поскольку некоторые разработчики обоих являются одними и теми же людьми, слияние уже происходит. Цель состоит в том, чтобы в какой-то момент, когда LXQt станет достаточно зрелым и все будут довольны этим, LXDE будет заброшен - но это всего лишь желание, поскольку некоторые люди все же могут решить сохранить LXDE навсегда, несмотря на статус LXQt. На данный момент никто не знает наверняка, и обе поддерживаются в равной степени.

3
27.01.2020, 21:59

Теги

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