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


Ответы:


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


1

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

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

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

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

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


1
Похоже, это не добавляет ничего сверх того, о чем уже говорит четырехлетний ответ Денниса .
8bittree

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


0

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

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

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

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

find . -regex '^A.*[0-9]{2}$' -delete
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.