Я намагався видалити файли, які починаються з A і закінчуються двома номерами, але це нічого не робить.
Що я спробував:
rm ^A*[0..9]2$
Де я помиляюся?
Я намагався видалити файли, які починаються з A і закінчуються двома номерами, але це нічого не робить.
Що я спробував:
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
(регулярний вираз). 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 man:
rm A*[0-9][0-9]
Рішення з regexp в 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