Это не легко. Проблема - это, когда Вы делаете:
rm -- *.txt
комната просто видит список файлов, не globbing шаблон, который был уже расширен оболочкой.
То, что Вы могли сделать, (zsh):
alias rm='noglob rm'
Это говорит zsh, что шаблоны не должны быть расширены при вызове комнаты. Затем можно переопределить комнату как функцию, которая делает само расширение и добавляет "-i" в случае необходимости что-то как:
'rm'() {
[[ "$*" = *[*[?]* ]] && set -- -i "$@"
command rm $~@
}
Проблема с тем подходом, хотя то, что эта новая "комната" не видит различия между
rm *
и
rm '*'
Удалить названный файл *
, необходимо было бы записать это:
rm [*]
extended_glob
опция дает Вам собственный расширенный синтаксис шарика zsh.
setopt extended_glob
rm -- ^*.dmg
rm -- ^*.(dmg|txt)
Можно установить ksh_glob
опция получить ksh шарики. Остерегайтесь этого в общем падеже, где отрицательный шаблон является последней вещью в слове, zsh может проанализировать круглые скобки как спецификаторы шарика (это не делает этого в ksh режиме эмуляции).
setopt ksh_glob
rm -- !(*.dmg|*.txt)
setopt no_bare_glob_qual
rm -- !(*.dmg)
Другой способ удалить файлы с find
, xargs
и rm
:
find . -mindepth 1 -maxdepth 1 ! -name '*.dmg' -print0 | xargs -0 rm
Можно использовать find
вместо Вашей оболочки:
find . -mindepth 1 -maxdepth 1 ! -name "*.dmg" -delete
От man find
:
! expr True if expr is false. This character will also usually need
protection from interpretation by the shell.
-name pattern
Base of file name (the path with the leading directories removed)
matches shell pattern pattern.
-delete
Delete files; true if removal succeeded. If the removal failed,
an error message is issued. If -delete fails, find's exit status
will be nonzero (when it eventually exits). Use of -delete
automatically turns on the -depth option.
Если Вы не можете использовать find
по любой причине вот способ сделать это с zsh
(или другие оболочки). zsh
быть zsh
, существует, вероятно, более простой способ сделать это, но так как я - a bash
парень, это - то, что я придумал:
for file in *; do if [[ ! "$file" == *.dmg ]]; then rm $file; fi; done
find [Process completed]
– Dzung Nguyen
24.11.2013, 17:51
find
. Я предлагаю, чтобы Вы отправили вопрос о Вашем find
выйдите, хотя, которого не должно происходить. Если Вы делаете, включайте вывод type -a find
.
– terdon♦
24.11.2013, 18:02
rm !(*.dmg)
, после shopt -s extglob
.
– Gilles 'SO- stop being evil'
24.11.2013, 23:23
find is a shell function find is /usr/bin/find
– Dzung Nguyen
25.11.2013, 00:26
/usr/bin/find
. Вам назвали функцию find
определенный в одном из Ваших файлов конфигурации удара. Так как Вы находитесь на OSX, это, вероятно, ~/.profile
.
– terdon♦
25.11.2013, 02:30
rm -r secrets/!(directory)
это продолжает проситьnumber expected
или иногда это дает мнеevent not found: directory
– CMCDragonkai 01.06.2014, 16:46ksh_glob
опция. “мероприятие, не учрежденное: каталог” указывает на выполнение удара (который также понимает!(…)
синтаксис, но только послеshopt -s extglob
). – Gilles 'SO- stop being evil' 01.06.2014, 22:01setopt ksh_glob; echo !(a|b)
работы, в то время какsetopt ksh_glob; echo !(a)
не делает ("число, ожидаемое")... – ThiefMaster 15.02.2015, 16:09