Видаліть файли без рядка в імені


9

Я хочу видалити файли, які не мають рядка "999" (без символу "").

Я намагався:

grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --

Але жоден з них не працює. Я використовую macOS Sierra, з bash: 3.2.57.


2
grep -lзмушує перераховувати файли, у яких -vу вмісті знайдено (або не знайдено ) збіг , а не ім'я файлу. grepзавжди відповідає вмісту файлів, які ви вказуєте, ніколи їх імена.
JoL

Відповіді:


18

Використання розширеного шаблону глобалізації в bash:

rm ./!(*999*)

Це потрібно shopt -s extglobввімкнути (і для безпеки також shopt -s failglob, щоб жоден файл із незвичним іменем !(*999*)не видалявся помилково, якщо містять усі назви файлів 999). Шаблон !(*999*)буде відповідати будь-якому імені в поточному каталозі, за винятком тих імен, які відповідають *999*. Щоб також видалити приховані файли (файли, ім'я яких починається з крапки ), також увімкніть цю dotglobопцію.

Щоб дбати лише про звичайні файли або символічні посилання на звичайні файли (а не каталоги тощо):

for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done

zshЕквівалентно оболонки до петлі вище буде

rm ./(^(*999*))(.)

Ваша перша команда не буде працювати, оскільки grepбуде заглядати у файли. Він видалить усі файли, у яких немає рядків без 999них (якби ви додали --nullопцію, щоб вона працювала xargs -0).

Ваша друга команда не працюватиме, оскільки grepна macOS не підтримується --null-data(проте в неї є --nullопція, але лише для генерації виводу імені файлу). Також зверніть увагу , що він буде шукати в 999будь-якому місці файлу в дорозі (включаючи компоненти каталогу), а не тільки ім'я файлу.


1
Ви також хочете включити цю failglobопцію, !(*999*)інакше це може призвести до видалення названого файлу, якщо немає іншого файлу, ім'я якого не містить 999.
Стефан Шазелас

16

Просто переверніть умову імені в find:

find . -type f \! -name "*999*" 

Додайте -deleteабо -exec rm {} +фактично видаліть відповідні файли.


2
!в безпеці в bash.
Кусалаланда
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.