Як видалити файли в командному рядку за допомогою регулярних виразів?


18

Скажімо, у мене є 20 файлів з назвою FOOXX, де XX - це номер файлу, наприклад 01, 02 тощо.

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

Однак якщо я хочу видалити конкретні файли в межах діапазону, наприклад, 13-15, це стає складніше.

rm FPP [13-15] не працює, і запитує мене, чи хочу я видалити всі файли. Likewse 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

лс | греп-регекс | xargs rm


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

1
Звичайно, якщо ви збираєтесь використовувати, findто ви можете просто використовувати -exec.
Ігнасіо Васкес-Абрамс

У моєму випадку у файлах були пробіли, а зміна роздільника виправляє питання пробілів: ls | греп-регекс | xargs --delimiter = '\ n' rm
Anake


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