Видаліть файли з регулярним виразом


41

Я намагався видалити файли, які починаються з A і закінчуються двома номерами, але це нічого не робить.
Що я спробував:

rm ^A*[0..9]2$

Де я помиляюся?

Відповіді:


56

Для видалення всіх файлів, що відповідають вашим критеріям, можна скористатися такою командою:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

Як це працює:

  1. ls перелічує всі файли (один за рядком, оскільки результат є конвеєрним).

  2. grep -P "^A.*[0-9]{2}$" фільтрує список файлів і залишає лише ті, що відповідають регулярному виразу ^A.*[0-9]{2}$

    • .*вказує на будь-яку кількість подій ., де .є майна , що відповідає будь-якому символу.

    • [0-9]{2}вказує рівно на два входження [0-9], тобто будь-яку цифру.

  3. xargs -d"\n" rmвиконується rm lineодин раз за кожне, lineщо на нього покладено.

Де я помиляюся?

Для початку rmне приймайте регулярний вираз як аргумент. Крім підстановки *, до кожного другого персонажа трапляється буквально.

Крім того, ваш регулярний вираз трохи знижений. Наприклад, *означає входження ...в регулярному виразі, тому A*матчі A, AAі т.д. , і навіть порожній рядок.

Для отримання додаткової інформації відвідайте Regular-Expressions.info .


3
Остерігайтеся пробілів у назвах файлів.
slhck

1
-d"\nПеремикач усуває проблему простору.
Пн

1
Зауважте - деякі дистрибутиви (як Mac OS) не мають grep -P(регулярний вираз). grep -Eможе працювати в цьому випадку.
bluescrubbie

1
Я вважаю за краще використовувати -Iз xargsі завжди тест з несмертельної командами першим:xargs -d"\n" -I {} echo "{}"
jozxyqk

1
Розбір ls? Дивіться це питання, яке вказує на цю статтю . Через підводні камені ви можете rmробити те, чого не хочете.
Каміль Маціоровський

46

Або використовуючи find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

Це рішення стосуватиметься дивних імен файлів.


5
Це чудове рішення. Я вважаю за краще, тому що це простіше, і ви можете спочатку пропустити прапор -delete, щоб побачити, чи правильний ваш регекс перед масовим видаленням файлів.
JAMESSTONEco

1
Крім того, ви маєте більше контролю над тим, що ви видаляєте, наприклад додаючи-type f
Marco Sulla

Чи можна це використовувати для видалення файлів і папок? Це не працює для непорожніх папок.
Олексій

@ Алекс ні, каталог повинен бути порожнім (все одно це не було вимогою ОП), ви можете використовувати xargsпідхід rm -f.
cYrus


1

Рішення з regexp в 200 разів краще, навіть якщо ви бачите, який файл буде видалено перед використанням команди, відрізаючи остаточну трубку:

ls | grep -P "^A.*[0-9]{2}$"

Тоді, якщо це правильно, просто використовуйте:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

Це в 200 разів краще, тому що якщо ви працюєте з Unix, важливо знати, як використовувати grep. Це дуже потужно, якщо ви вмієте ним користуватися.


1
Це, мабуть, не набагато перевищує те, що вже сказано у відповіді 4-річної відповіді Денніса .
8bittree

1
"200 разів" - досить специфічна. Багато інших команд теж дуже потужні, все, що вам потрібно зробити, - це навчитися їх використовувати.
glenn jackman


0

find команда працює і з регулярними виразами.

Перевірте, які файли потрібно видалити

find . -regex '^A.*[0-9]{2}$'

Видалення файлів

find . -regex '^A.*[0-9]{2}$' -delete
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.