Caps Lock, ведомая, не работая над консолью Linux

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

Метод № 1 - использование -delete

$ find . -type f -iname '*.xml' -o -iname '*.png'\
       -o -iname '*.jpeg' -o -iname '*.gif' -delete

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

10.1.6 Используя '-delete' действие


Самый эффективный и безопасный метод решения этой проблемы должен использовать '-delete' действие:

 find /var/tmp/stuff -mtime +90 -delete

Эта альтернатива более эффективна, чем любой из -exec' or- execdir' действия, так как это полностью избегает издержек разветвления нового процесса и использования exec' to run/bin/rm'. Это также обычно более эффективно, чем xargs' for the same reason. The file deletion is performed from the directory containing the entry to be deleted, so the- удалите' действие, имеет те же преимущества безопасности, как '-execdir' действие имеет.

'-Delete' действие был представлен семейством BSD операционных систем.

Примечание: Одна вещь иметь в виду с этим подходом, использованием -delete подразумевает также переключатель -depth. Что это означает? Вот пример как -delete может записать Вас, если Вы не осторожны.

Например, скажите, что у меня есть рабочий каталог подверсии, где я хочу очистить некоторые файлы, но оставить его .svn подкаталоги неповрежденными. Я мог бы использовать следующую команду для выполнения этого:

$ find . -not "(" -name .svn -type d -prune ")" -type f -print
./a.txt

Но потому что -delete включает a -depth переключатель, файлы, которые на самом деле добрались бы, имел дело с:

$ find . -not "(" -name .svn -type d -prune ")" -type f -print -depth
./.svn/all-wcprops
./.svn/entries
./.svn/format
./.svn/text-base/a.txt.svn-base
./a.txt

Поэтому при использовании -delete, заботу нужно соблюдать.

Метод № 2 - -exec command {} +

$ find . -type f -iname '*.xml' -o -iname '*.png'\
       -o -iname '*.jpeg' -o -iname '*.gif' -exec rm {} \+

По сравнению с -delete метод, это наиболее вероятно следующий наилучший вариант, с точки зрения производительности и мобильности через Unixes. -exec ... {} + нотация работает следующим образом:

из страницы справочника находки

Этот вариант - исполнительное действие выполняет указанную команду на выбранных файлах, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество подобранных файлов. Командная строка создается почти таким же способом, которым xargs создает свои командные строки. Только один экземпляр '{}' позволяется в рамках команды. Команда выполняется в начальном каталоге.

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

Метод № 3 - xargs

$ find . -type f -iname '*.xml' -o -iname '*.png'\
       -o -iname '*.jpeg' -o -iname '*.gif' -print0 | xargs -0 rm -f

find ... -print0 создаст список файлов, соответствующих указанным критериям. Этот список затем передается через канал xargs. -print0 переключатель помещает символ ASCII NUL, поскольку разделитель между каждым результатом находит. -0 включить xargs заставляет его предположить, что файлы, передаваемые в, разделяются символами ASCII NUL.

По сравнению с методами № 1 и № 2, у этого будет подобная производительность к № 2, однако -print0 переключатель универсально не поддерживается через весь Unixes.

Метод № 4 - -exec command {} \;

$ find . -type f -iname '*.xml' -o -iname '*.png'\
       -o -iname '*.jpeg' -o -iname '*.gif' | exec rm -f {} \;

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

Дополнительные соображения вокруг безопасности

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

Примите свой корень, и Вы выполняете следующую команду:

$ find /var/tmp/somedir -type f -exec rm {} \;

Без ведома Вам, кто-то злонамеренно создал ссылку на /etc каталог под /var/tmp/somedir. Когда вышеупомянутая команда работает, /etc каталог будет также удален. Эта проблема существует с любым из методов для удаления файлов, за исключением -delete опция (метод № 1).

tl; доктор;

Самый быстрый и самый безопасный способ удалить файлы с помощью находки состоит в том, чтобы использовать -delete. Используя xargs -0 может быть подобным в производительности, но это не столь безопасно. -delete действие не является абсолютно портативным. Самая эффективная портативная альтернатива -exec ... +, но это небезопасно и не поддерживается версиями GNU findutils до 4.2.12.

Ссылки

7
15.06.2014, 23:49
2 ответа

Это давно существующая ошибка Debian . Кажется, это связано с ошибкой в ядре bug, которая была исправлена давно. Проблема в том, что Caps_Lock не работал для не-ASCII символов, поэтому обходным путем было сопоставление Shift_Lock или CtrlL_Lock с ключом caps lock вместо него.

На стороне Debian вопрос создаётся ckbcomp, который используется console-setup для создания консольной раскладки клавиатуры из описания клавиатуры XKB. Обратите внимание, что оригинальный код, на который ссылались в сообщении об ошибке, используя Shift_Lock, похоже, был заменён другим кодом, который переключается на CtrlL_Lock вместо . Если вам интересно, то вы можете поискать использование переменной broken_caps в Perl скрипте ckbcomp.

Понятия не имею, нужен ли код по каким-то причинам, может быть, стоит пропустить сообщение об ошибке. Тем не менее, обходной путь состоит в том, чтобы поставить следующую строку в /etc/kbd/remap и исправить ее после перезагрузки:

s/CtrlL_Lock/Caps_Lock/

Или для временного исправления до следующей перезагрузки запустите следующее в сессии tty:

dumpkeys | sed s/CtrlL_Lock/Caps_Lock/ | sudo loadkeys

Update

Кажется, что /etc/kbd/remap на самом деле используется только в том случае, если setupcon недоступен. Лучше обходной путь - просто поставить следующую строку в /etc/rc.local:

dumpkeys | sed s/CtrlL_Lock/Caps_Lock/ | loadkeys
8
27.01.2020, 20:16

Я нашел решения для Debian 6 и Debian 7.

Debian 6

Положите следующее в конце /etc/console-setup/remap.inc файл:

keycode 58 = Caps_Lock

Затем запустить Setuppcon

Debian 7

Установите следующие в конце / etc / default / keyboard :

dumpkeys | sed -e "s/keycode  58 = CtrlL_Lock/keycode  58 = Caps_Lock/" | \
   loadkeys 2>&1 >/dev/null

затем запустить setuppcon

Обратите внимание, что Существует два пробела между ключевым кодом и 58. Перенаправление в / dev / null просто подавляет раздражающий консольный выход.

4
27.01.2020, 20:16

Теги

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