Я пытался удалить файлы, которые начинаются с буквы А и заканчиваются 2 числами, но ничего не происходит.
Что я пробовал:
rm ^A*[0..9]2$
Где я не прав?
Вы можете использовать следующую команду, чтобы удалить все файлы, соответствующие вашим критериям:
ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm
Как это работает:
ls
перечисляет все файлы (один за другим, так как результат передается по конвейеру).
grep -P "^A.*[0-9]{2}$"
фильтрует список файлов и оставляет только те, которые соответствуют регулярному выражению ^A.*[0-9]{2}$
.*
указывает любое количество вхождений .
, где .
подстановочный знак соответствует любому символу.
[0-9]{2}
обозначает ровно два вхождения [0-9]
, то есть любую цифру.
xargs -d"\n" rm
выполняется rm line
один раз для каждого, line
что к нему направлено.
Где я не прав?
Для начала, rm
не принимает регулярное выражение в качестве аргумента. Помимо подстановочного знака *
, любой другой персонаж трактуется буквально.
Кроме того, ваше регулярное выражение слегка отключено. Например, *
означает вхождения ...
в регулярном выражении, поэтому A*
матчи A
, AA
и т.д. , и даже пустую строку.
Для получения дополнительной информации посетите Regular-Expressions.info .
-d"\n
Переключатель устраняет проблему пространства.grep -P
(регулярное выражение Perl).grep -E
может работать в этом случае.-I
сxargs
и всегда сначалаxargs -d"\n" -I {} echo "{}"
ls
? Смотрите этот вопрос, который указывает на эту статью . Из-за ловушек вы можетеrm
то, чего не хотите.Или используя
find
:Это решение будет работать со странными именами файлов.
источник
-type f
xargs
подход сrm -f
.Смотрите раздел расширения имени файла на странице руководства bash:
источник
Решение с регулярным выражением в 200 раз лучше, даже при том, что вы можете видеть, какой файл будет удален перед использованием команды, отрезав окончательный канал:
Тогда, если это правильно, просто используйте:
Это в 200 раз лучше, потому что если вы работаете с Unix, важно знать, как использовать grep. Это очень мощно, если вы знаете, как его использовать.
источник
Это работает на моем Mac:
rm $(ls | grep -e '^A*[0..9]2$')
источник
find
Команда также работает с регулярными выражениями.Проверьте, какие файлы будут удалены
Удалить файлы
источник