захват dotfiles с-R правильно?

Принятие Вашего powertop находится в /usr/sbin, можно использовать sudo /usr/sbin/powertop без пароля. Чтобы сделать это, необходимо работать visudo и добавьте followind строку, заняв место yourusername с реальным:

yourusername ALL=(root) NOPASSWD: /usr/sbin/powertop
3
09.02.2013, 04:19
8 ответов

Благодаря этой 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:~$
4
27.01.2020, 21:08

Если Вы находитесь на 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 {} +
7
27.01.2020, 21:08
  • 1
    Включая ..[!.]* кажется немного истеричным; у Вас на самом деле есть файлы, имена которых запускаются с также точек? Я назначил бы grep -IR culprit .[!.]* как довольно корректный, компактный, портативный, канонический ответ. –  tripleee 09.02.2013, 13:26
  • 2
    Абсолютно. Просто .[!.]* имел бы дело с 99,9% случаев, и предложенный шаблон jordanm и корректен и не имеет проблемы nullglob. –  Mikel 10.02.2013, 03:39

Если Вы имеете удар в наличии, можно использовать extglob добираться только dotfiles.

shopt -s extglob
grep -IR 'foo' .!(|.)

! оператор в расширенном шарике не. Этот шаблон соответствует чему-либо запускающемуся с точки, исключая '.' и '..'.

4
27.01.2020, 21:08

Я использую этот сценарий для быстрого редактирования 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 "*.
1
27.01.2020, 21:08
grep -IR culprit .[!.]*

.[!.]* соответствия все точечные файлы кроме тех, которые начинают ... Так как точечные файлы не начинаются .., это в порядке.

Или Вы могли использовать zsh, который никогда не включает . или .. в шарике:

grep -IR culprit .*

Более тайно, в ударе, если Вы имеете extglob опция включена (shopt -s extglob), это работает и включает ..?* (это также работает в ksh, и в zsh после setopt ksh_glob):

grep -IR culprit !(|.)
1
27.01.2020, 21:08

Для решения проблемы попробуйте это вместо этого (в ударе), который соответствует всему, но ..:

shopt -s dotglob; grep -e culprit -IR *

Но на самом деле Вы хотели это,

grep -e culprit -IR .

.* является ненужным, так как можно запустить grep из текущего каталога.

0
27.01.2020, 21:08
  • 1
    grep -e culprit -IR . просто другой способ записать мой второй пример. Который является тем, что я хочу за исключением того, что я хочу исключить (из расширения, не из рекурсии), все, что не запускается с точки и ... Точка должна искать в различных файлах конфигурации пакета и избежать любых данных реального пользователя. –  Alois Mahdal 09.02.2013, 05:03
  • 2
    BTW я не понимаю последнее предложение: в противоположность *, который не соответствует скрытым файлам, .* действительно соответствует им. Только существует маленькая "выгода": это соответствует .. и . также, который очень плох в моем случае. Но что делает .* иметь отношение к "текущему каталогу"? –  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

Должен быть более хороший путь, хотя...

0
27.01.2020, 21:08
  • 1
    Существует лучший путь. Это будет работать в большинстве случаев, но не будет соответствовать допустимым точечным файлам такой как '.,foo', если такой файл существовал. Ваш метод является POSIX и будет работать во всех оболочках, в отличие от моего. –  jordanm 09.02.2013, 05:26
  • 2
    Когда Вы говорите [a-zA-Z0-9] Вы действительно имеете в виду "не точку", которая записана [!.]. –  Mikel 09.02.2013, 07:13

Попытка:

grep -R -e culprit \.*

Обратная косая черта перед точкой, я думаю, сделает это, литеральная точка вместо того, чтобы рассматривать точку как значение метасимвола соответствует любому атому.

-3
27.01.2020, 21:08
  • 1
    Вы тестировали свое решение прежде, чем отправить его? –  Mikel 12.02.2013, 07:01
  • 2
    Да, сделал, но только очень быстро –  Jason Tan 13.02.2013, 11:33

Теги

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