Я пытался удалить файлы, которые начинаются с буквы А и заканчиваются 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