Я намагався видалити файли, які починаються з 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