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


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

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


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

6

ls | grep regex | XARGS RM


6
Вы должны использовать find -regex ... -print0 | xargs -0 ...для этого, иначе это не сработает для имен файлов с пробелами.
Приостановлено до дальнейшего уведомления.

1
Конечно, если вы собираетесь использовать, findто вы можете просто использовать -exec.
Игнасио Васкес-Абрамс

В моем случае в файлах были пробелы, а изменение разделителя устраняет проблему с пробелами: ls | grep regex | xargs --delimiter = '\ n' rm
Anake


@evilsoup, +1 за добавление этого предупреждения, но кто вставляет новую строку в имя файла?
Юлиан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.