Я пытался удалить файлы, которые начинаются с буквы A и заканчиваются 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.
Или используя find
:
find your-directory/ -name 'A*[0-9][0-9]' -delete
Это решение будет работать со странными именами файлов.
См. Раздел расширения имени файла справочной страницы bash:
rm A*[0-9][0-9]
Решение с регулярным выражением в 200 раз лучше, даже при том, что вы можете видеть, какой файл будет удален перед использованием команды, отрезав окончательный канал:
ls | grep -P "^A.*[0-9]{2}$"
Тогда, если это правильно, просто используйте:
ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm
Это в 200 раз лучше, потому что, если вы работаете с Unix, важно знать, как использовать grep. Это очень мощно, если вы знаете, как его использовать.
Это работает на моем Mac:
rm $(ls | grep -e '^A*[0..9]2$')