Удалить файлы с регулярным выражением

41

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

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

Где я не прав?

Гдорон поддерживает Монику
источник

Ответы:

56

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

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 .

Деннис
источник
3
Остерегайтесь пробелов в именах файлов.
slhck
1
-d"\nПереключатель устраняет проблему пространства.
Frg
1
Обратите внимание - некоторые дистрибутивы (например, Mac OS) не имеют grep -P(регулярное выражение Perl). grep -Eможет работать в этом случае.
bluescrubbie
1
Я предпочитаю использовать -Iс xargsи всегда сначала xargs -d"\n" -I {} echo "{}"
проверять
1
Разбор ls? Смотрите этот вопрос, который указывает на эту статью . Из-за ловушек вы можете rmто, чего не хотите.
Камиль Мачоровский
46

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

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

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

Кир
источник
5
Это отличное решение. Я предпочитаю это, потому что это проще, и вы можете сначала опустить флаг -delete в конце, чтобы проверить правильность вашего регулярного выражения перед массовым удалением ваших файлов.
JAMESSTONEco
1
Кроме того, у вас есть больше контроля над тем, что вы удаляете, например, добавление-type f
Marco Sulla
Можно ли это использовать для удаления файлов и папок? Это не работает для не пустых папок.
Алекс
@ Алекс Нет, каталог должен быть пустым (это не было требованием OP в любом случае), вы можете использовать xargsподход с rm -f.
cyrus
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. Это очень мощно, если вы знаете, как его использовать.

Salvatore
источник
1
Похоже, это не добавляет ничего сверх того, о чем уже говорит четырехлетний ответ Денниса .
8bittree
1
«200 раз» - это довольно специфично. Многие другие команды тоже очень мощные, все, что вам нужно сделать, это научиться их использовать.
Гленн Джекман
1

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

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

луч
источник
0

find Команда также работает с регулярными выражениями.

Проверьте, какие файлы будут удалены

find . -regex '^A.*[0-9]{2}$'

Удалить файлы

find . -regex '^A.*[0-9]{2}$' -delete
Петр Яворик
источник