Существует в основном 4 пути, которыми можно приблизиться, это использование задач находят.
-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
, заботу нужно соблюдать.
-exec command {} +
$ find . -type f -iname '*.xml' -o -iname '*.png'\
-o -iname '*.jpeg' -o -iname '*.gif' -exec rm {} \+
По сравнению с -delete
метод, это наиболее вероятно следующий наилучший вариант, с точки зрения производительности и мобильности через Unixes. -exec ... {} +
нотация работает следующим образом:
из страницы справочника находки
Этот вариант - исполнительное действие выполняет указанную команду на выбранных файлах, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество подобранных файлов. Командная строка создается почти таким же способом, которым xargs создает свои командные строки. Только один экземпляр '{}' позволяется в рамках команды. Команда выполняется в начальном каталоге.
Таким образом, в действительности этот метод работает подобный xargs
, но не имея необходимость переходить через обручи передачи вывода находки через канал к xargs
.
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.
-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).
Самый быстрый и самый безопасный способ удалить файлы с помощью находки состоит в том, чтобы использовать -delete
. Используя xargs -0
может быть подобным в производительности, но это не столь безопасно. -delete
действие не является абсолютно портативным. Самая эффективная портативная альтернатива -exec ... +
, но это небезопасно и не поддерживается версиями GNU findutils до 4.2.12.
Это давно существующая ошибка 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
Кажется, что /etc/kbd/remap
на самом деле используется только в том случае, если setupcon
недоступен. Лучше обходной путь - просто поставить следующую строку в /etc/rc.local
:
dumpkeys | sed s/CtrlL_Lock/Caps_Lock/ | loadkeys
Я нашел решения для Debian 6 и Debian 7.
Положите следующее в конце /etc/console-setup/remap.inc
файл:
keycode 58 = Caps_Lock
Затем запустить Setuppcon
Установите следующие в конце / etc / default / keyboard
:
dumpkeys | sed -e "s/keycode 58 = CtrlL_Lock/keycode 58 = Caps_Lock/" | \
loadkeys 2>&1 >/dev/null
затем запустить setuppcon
Обратите внимание, что Существует два пробела между ключевым кодом и 58. Перенаправление в / dev / null
просто подавляет раздражающий консольный выход.