Я пытался удалить файлы, которые начинаются с буквы А и заканчиваются 2 числами, но ничего не происходит.
Что я пробовал:
rm ^A*[0..9]2$
Где я не прав?
Я пытался удалить файлы, которые начинаются с буквы А и заканчиваются 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:
find your-directory/ -name 'A*[0-9][0-9]' -delete
Это решение будет работать со странными именами файлов.
-type f
xargsподход с rm -f.
Смотрите раздел расширения имени файла на странице руководства 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. Это очень мощно, если вы знаете, как его использовать.
find Команда также работает с регулярными выражениями.
Проверьте, какие файлы будут удалены
find . -regex '^A.*[0-9]{2}$'
Удалить файлы
find . -regex '^A.*[0-9]{2}$' -delete