POSIBLEMENTE:
find. ! \( -name '*.tr0' -o -name '*.scs' \) -type f -exec echo rm -f {} +
(Elimina echo
cuando quieras ejecutar el comando)
Si su find
apoyo-delete
:
find. ! \( -name '*.tr0' -o -name '*.scs' \) -type f -delete
El comando anterior funcionará recursivamente. Si desea solo en el directorio actual:
find. ! -name. -prune ! \( -name '*.tr0' -o -name '*.scs' \) -type f
[это должен был быть комментарий, но мои комментарии, как правило, удаляются модераторами, так что это останется как ответ, который я мог бы использовать в качестве ссылки, даже если он будет удален]
Использование BASH_SUBSHELL
совершенно ненадежно, так как оно установлено в 1 только в некоторых подоболочках, а не во всех подоболочках.
$ (echo $BASH_SUBSHELL)
1
$ echo $BASH_SUBSHELL | cat
0
Прежде чем утверждать, что подпроцесс, в котором выполняется конвейерная команда, не является действительно настоящей подоболочкой, рассмотрим этот man bash
фрагмент:
Each command in a pipeline is executed as a separate process (i.e., in a subshell).
и практические последствия --важно, выполняется ли фрагмент скрипта как подпроцесс или нет, а не какая-то терминологическая придирка.
Единственное решение, как уже объяснялось в ответах на этот вопрос , состоит в том, чтобы проверить, равно ли $BASHPID
$$
или, переносимо, но гораздо менее эффективно:
if [ "$(exec sh -c 'echo "$PPID"')" != "$$" ]; then
echo you\'re in a subshell
fi
Как насчет BASH_SUBSHELL
?
BASH_SUBSHELL
Incremented by one within each subshell or subshell environment when the shell
begins executing in that environment. The initial value is 0.
$ echo $BASH_SUBSHELL
0
$ (echo $BASH_SUBSHELL)
1
В bash вы можете сравнить $BASHPID
с$$
$ ( if [ "$$" -eq "$BASHPID" ]; then echo not subshell; else echo subshell; fi )
subshell
$ if [ "$$" -eq "$BASHPID" ]; then echo not subshell; else echo subshell; fi
not subshell
Если вы не используете bash, $$
должен оставаться тем же самым в подоболочке, поэтому вам понадобится какой-то другой способ получить фактический идентификатор процесса.
Один из способов получить фактический pid — sh -c 'echo $PPID'
. Если вы просто поместите это в обычный ( … )
, может показаться, что он не работает, так как ваша оболочка оптимизировала вилку. Попробуйте дополнительные команды no -op ( : ; sh -c 'echo $PPID'; : )
, чтобы он думал, что подоболочка слишком сложна для оптимизации. Кредит принадлежит John1024 на Stack Overflow за этот подход.