Принятие Вашего powertop находится в /usr/sbin
, можно использовать sudo /usr/sbin/powertop
без пароля. Чтобы сделать это, необходимо работать visudo
и добавьте followind строку, заняв место yourusername
с реальным:
yourusername ALL=(root) NOPASSWD: /usr/sbin/powertop
Благодаря этой Wiki я нашел, что существует это GLOBIGNORE
переменная:
Переменная Bash (не shopt) GLOBIGNORE позволяет, Вы для определения копируете шарик, не должен соответствовать. Это позволяет Вам работать вокруг печально известного, "Я хочу соответствовать всем своим точечным файлам, но нет. или.." проблема:
$ echo .* . .. .bash_history .bash_logout .bashrc .inputrc .vimrc $ GLOBIGNORE=.:.. $ echo .* .bash_history .bash_logout .bashrc .inputrc .vimrc
Хорошая вещь состоит в том, что это не имеет почти никаких побочных эффектов (я имею в виду, как часто Вы действительно хотите соответствовать ..
и .
?), таким образом, это было бы даже приемлемо для export GLOBIGNORE=.:..
от .bashrc
, и поскольку ручные задачи просто используют старое .*
шарик, как в первом примере в Q.
me@here:~$ set | grep GLOBIGNORE
GLOBIGNORE=.:.
me@here:~$ grep -IR .* -e culprit
.some-app/config: set culprit=1
me@here:~$
Если Вы находитесь на Linux, можно попробовать
grep -IR --exclude-dir=".." culprit .*
Так как Вы спросили о подстановочных знаках оболочки, моя первая мысль .[!.]* ..[!.]*
, как в
grep -IR culprit .[!.]* ..[!.]*
Который имеет проблему это grep
выйдет с ошибкой, если не будет никаких файлов, запускающихся с ..
. Для обхождения этого можно или добавить -s
кому: grep
сказать этому игнорировать недостающие файлы:
grep -IRs culprit .[!.]* ..[!.]*
Или используйте bash
и zsh
nullglob
опция сделать ..[!.]*
ни до чего не расширьтесь, если нет никакого начала файлов ..
shopt -s nullglob # for bash
setopt nullglob # for zsh
grep -IR culprit .[!.]* ..[!.]*
При сбое всего вышеупомянутого всегда существует find
find . -path "./.*" -exec grep culprit {} +
..[!.]*
кажется немного истеричным; у Вас на самом деле есть файлы, имена которых запускаются с также точек? Я назначил бы grep -IR culprit .[!.]*
как довольно корректный, компактный, портативный, канонический ответ.
– tripleee
09.02.2013, 13:26
.[!.]*
имел бы дело с 99,9% случаев, и предложенный шаблон jordanm и корректен и не имеет проблемы nullglob.
– Mikel
10.02.2013, 03:39
Если Вы имеете удар в наличии, можно использовать extglob
добираться только dotfiles.
shopt -s extglob
grep -IR 'foo' .!(|.)
!
оператор в расширенном шарике не. Этот шаблон соответствует чему-либо запускающемуся с точки, исключая '.'
и '..'
.
Я использую этот сценарий для быстрого редактирования dotfiles:
dirs=($HOME/.$1* $HOME/.$1/ $XDG_CONFIG_HOME/$1/)
IFS=$'\n'
read -r -d '' -a files /dev/null)
(( ${#files[*]} )) && "$EDITOR" "${files}"
Больше версии POSIX:
find "${dirs[@]}" -type f \( -name "*.conf" -o -name "conf" -o -name "config" \
-o -name "*rc" -o -name "*.
grep -IR culprit .[!.]*
.[!.]*
соответствия все точечные файлы кроме тех, которые начинают ..
. Так как точечные файлы не начинаются ..
, это в порядке.
Или Вы могли использовать zsh, который никогда не включает .
или ..
в шарике:
grep -IR culprit .*
Более тайно, в ударе, если Вы имеете extglob
опция включена (shopt -s extglob
), это работает и включает ..?*
(это также работает в ksh, и в zsh после setopt ksh_glob
):
grep -IR culprit !(|.)
Для решения проблемы попробуйте это вместо этого (в ударе), который соответствует всему, но ..
:
shopt -s dotglob; grep -e culprit -IR *
Но на самом деле Вы хотели это,
grep -e culprit -IR .
.*
является ненужным, так как можно запустить grep
из текущего каталога.
grep -e culprit -IR .
просто другой способ записать мой второй пример. Который является тем, что я хочу за исключением того, что я хочу исключить (из расширения, не из рекурсии), все, что не запускается с точки и ..
. Точка должна искать в различных файлах конфигурации пакета и избежать любых данных реального пользователя.
– Alois Mahdal
09.02.2013, 05:03
*
, который не соответствует скрытым файлам, .*
действительно соответствует им. Только существует маленькая "выгода": это соответствует ..
и .
также, который очень плох в моем случае. Но что делает .*
иметь отношение к "текущему каталогу"?
– Alois Mahdal
09.02.2013, 05:05
Просто найденный этим:
me@here:~$ grep -IR .[a-zA-Z0-9]* -e culprit
ужасный как ад и не тривиальный для ввода, но, кажется, делает задание. Большую часть времени Вы могли опустить ограничения и цифры:
me@here:~$ grep -IR .[a-z]* -e culprit
Должен быть более хороший путь, хотя...
'.,foo'
, если такой файл существовал. Ваш метод является POSIX и будет работать во всех оболочках, в отличие от моего.
– jordanm
09.02.2013, 05:26
[a-zA-Z0-9]
Вы действительно имеете в виду "не точку", которая записана [!.]
.
– Mikel
09.02.2013, 07:13
Попытка:
grep -R -e culprit \.*
Обратная косая черта перед точкой, я думаю, сделает это, литеральная точка вместо того, чтобы рассматривать точку как значение метасимвола соответствует любому атому.