sed -n -E 's/[ -n "$ID" -a "$ID" -le 200 ]/#&/p'
Не работает так, как вы ожидаете, это скорее совпадение:[...]
— это набор совпадающих символов. Внутри этой коллекции у вас есть диапазон -n
от пробела (0x20 )доn
(0x6E ), который может включать[
(0x5B ), в зависимости от ваших региональных настроек. Таким образом, коллекция соответствует первому символу. Видите, что происходит, когда вы берете #&___
в качестве замены... не в ваших намерениях, я полагаю?
И это причина того, что ваш полный регистр не работает. :Соответствующим символом для коллекции является ]
, потому что за ним следует остальная часть шаблона, поэтому туда вставляется #
.
Проблема с расширенным регулярным выражением аналогична предположению @steeldriver :$
привязывает шаблон:
A ( '$' ) outside a bracket expression shall anchor the expression or subexpression it ends to the end of a string; such an expression or subexpression can match only a sequence ending at the last character of a string. For example, the EREs "ef$" and "(ef$)" match "ef" in the string "abcdef", but fail to match in the string "cdefab", and the ERE "e$f" is valid, but can never match because the 'f' prevents the expression "e$" from matching ending at the last character.
Таким образом, в ERE литерал $
необходимо экранировать, а в BRE его нужно экранировать только в том случае, если он является последним символом шаблона.
Также обратите внимание, что -e
помечает следующий аргумент как сценарий и является необязательным, если имеется только один сценарий, а -E
является переключателем. Удаление -e
вместо ' -E `работает только в том случае, если есть только один сценарий, потому что он все равно был излишним.
find. -name '*.unwanted' ! -type d -delete
Удалить файлы, имя которых соответствует подстановочному знаку *.unwanted
(, за исключением файлов типа каталог ¹ )в текущем каталоге и подкаталогах -ниже. Если вы удалите ! -type d
, это также удалит файлы каталога, но только если они не пусты.
Обратите внимание, что он также удаляет скрытые файлы и файлы в скрытых каталогах.
-delete
является расширением BSD (, поэтому будет работать в macOS. )также встречается в нескольких других find
реализациях, включая GNU find
, но не является стандартным (замените на -exec rm -f {} +
, если ваш find
не поддерживает ).
Поскольку интерактивной оболочкой по умолчанию в macOS теперь является zsh
, в приглашении оболочки вы также сможете сделать то же самое с помощью:
rm -f -- **/*.unwanted(D^/) # same as find above, D for dot (hidden) files
rm -f -- **/*.unwanted(^/) # skip hidden files and dirs
rm -f -- **/*.unwanted(-^/) # consider the type of file after symlink resolution
rm -f -- ***/*.unwanted(^/) # follow symlinks when traversing the
# directory tree (same as find -L)
Однако вы можете столкнуться с ошибкой слишком длинного списка аргументов , если имеется большое количество файлов, что можно обойти с помощью zargs
или путем создания команды rm
, встроенной в zmodload zsh/files
..
Как find
предикаты, так и квалификаторы zsh glob (часть в(...)
)могут уточнить, какие файлы вы хотите удалить. Некоторые примеры:
-type f
/(.)
:только обычные файлы (вместо ! -type d
/(^/)
)-mtime -7
/(m-7)
: не старше 7 дней -size +1000000c
/(L+1000000)
:больше 1 МБ. -exec cmd {} \;
/ (e['cmd $REPLY'])
, файлы, для которых cmd
возвращает true. man
/ info
документацию по find
/ zsh
для получения подробной информации(info zsh qualifiers
). ¹ Однако символические ссылки будут удалены, независимо от того, указывают ли они на файлы типа каталог или нет