31

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

rm ^A*[0..9]2$

Где я не прав?

5 ответов5

45

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

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

Как это устроено:

  1. ls выводит список всех файлов (один за другим, поскольку результат передается по конвейеру).

  2. grep -P "^A.*[0-9]{2}$" фильтрует список файлов и оставляет только те, которые соответствуют регулярному выражению ^A.*[0-9]{2}$

    • .* указывает на любое количество вхождений . где . подстановочный знак, соответствующий любому символу.

    • [0-9]{2} обозначает ровно два вхождения [0-9] , то есть любую цифру.

  3. xargs -d"\n" rm выполняет rm line один раз для каждой переданной ей line .

Где я не прав?

Для начала, rm не принимает регулярное выражение в качестве аргумента. Помимо подстановочного знака * , любой другой символ трактуется буквально.

Кроме того, ваше регулярное выражение слегка отключено. Например, * означает любые вхождения ... в регулярном выражении, поэтому A* соответствует A , AA и т.д. И даже пустой строке.

Для получения дополнительной информации посетите Regular-Expressions.info.

39

Или используя find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

Это решение будет работать со странными именами файлов.

10

См. Раздел расширения имени файла справочной страницы bash:

rm A*[0-9][0-9]
1

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

ls | grep -P "^A.*[0-9]{2}$"

Тогда, если это правильно, просто используйте:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

Это в 200 раз лучше, потому что, если вы работаете с Unix, важно знать, как использовать grep. Это очень мощно, если вы знаете, как его использовать.

-1

Это работает на моем Mac:

rm $(ls | grep -e '^A*[0..9]2$')

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .