Ответы:
Использование расширенного шаблона сглаживания в 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
любом месте файла в пути (включая компоненты каталога), а не только имя файла.
failglob
опцию, иначе это может привести к удалению файла с именем, !(*999*)
если нет другого файла, имя которого не содержит 999
.
Просто инвертируйте имя условия в find
:
find . -type f \! -name "*999*"
Добавить -delete
или -exec rm {} +
фактически удалить соответствующие файлы.
!
безопасно в bash
.
grep -l
заставляет его перечислять файлы, в которых совпадение было найдено (или не найдено-v
) в содержимом , а не имя файла.grep
всегда сопоставляется с содержимым указанных вами файлов, а не с их именами.