удаление подстановочных знаков во всех подкаталогах, Mac OS

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 `работает только в том случае, если есть только один сценарий, потому что он все равно был излишним.

1
18.07.2020, 07:25
1 ответ
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).

¹ Однако символические ссылки будут удалены, независимо от того, указывают ли они на файлы типа каталог или нет

1
18.03.2021, 23:19

Теги

Похожие вопросы