Как удалить файлы из командной строки с помощью регулярных выражений?

18

Допустим, у меня есть 20 файлов с именем FOOXX, где XX - номер файла, например, 01, 02 и т. Д.

На данный момент, если я хочу удалить все файлы ниже номера 10, это легко, и я просто использую подстановочный знак, например, rm FOO0 *

Однако, если я хочу удалить определенные файлы в диапазоне, например, 13-15, это становится более сложным.

rm FPP [13-15] не работает и спрашивает меня, хочу ли я удалить все файлы. Аналогично rm FOO1 [3-5] желает удалить все файлы, которые начинаются с FOO1

Итак, каков наилучший способ удаления таких файлов?

Я пробовал как с bash, так и с zsh, и я не думаю, что они так сильно отличаются для такой основной задачи?

разъем
источник
«... rm FOO1 [3-5] хочет удалить все файлы, которые начинаются с FOO1». Это не имеет смысла, и, конечно, это не так.
Игнасио Васкес-Абрамс
@Ignacio, да, мне бы хотелось, чтобы в этом наборе символов был порядок сортировки!
Кмарш

Ответы:

31

В Bash вы можете использовать:

rm FOO1 {3..5}

или

rm FOO1 {3,4,5}

удалить FOO13, FOO14 и FOO15.

Скобки расширений Bash описаны здесь .

Майк Фицпатрик
источник
2
Или даже rm FOO{13..15}.
Игнасио Васкес-Абрамс
Это также верно для ZSH?
Джек,
@ Джек: Да, это так.
Приостановлено до дальнейшего уведомления.
@Jack: bashкоманды образуют подмножество zкоманд оболочки.
abhinavkulkarni
Поэтому мне нужно выучить как регулярное выражение, так и синтаксис. Громко рыдать или смеяться. :)
адитья депутат
13

Для будущих читателей findкоманда также может удалять файлы. Я остановился на подобной проблеме:

find . -type f -regex '...' -delete

но выбранный ответ является самым простым ответом на этот вопрос.

GregWW
источник
Выбранный ответ подходит только для файлов, которые соответствуют соглашению об именах. Благодаря вашему ответу я могу просто удалить все объектные файлы в каталоге. (в моем случае я просто пошел, find . -name "*.o" -deleteи это сработало как шарм)
Джон Гамильтон
6

ls | grep regex | XARGS RM

gogiel
источник
6
Вы должны использовать find -regex ... -print0 | xargs -0 ...для этого, иначе это не сработает для имен файлов с пробелами.
Приостановлено до дальнейшего уведомления.
1
Конечно, если вы собираетесь использовать, findто вы можете просто использовать -exec.
Игнасио Васкес-Абрамс
В моем случае в файлах были пробелы, а изменение разделителя устраняет проблему с пробелами: ls | grep regex | xargs --delimiter = '\ n' rm
Anake
@evilsoup, +1 за добавление этого предупреждения, но кто вставляет новую строку в имя файла?
Юлиан