Может быть, вы можете настроить oauth?
Также есть реализация для python (как я видел python в тегах): https://github.com/joestump/python-oauth2
В остальном, если бы я мог, я бы проголосовал против этого вопроса, поскольку предоставленной информации недостаточно. Но вы, я полагаю, вам нужно что-то вроде того, что я вам только что предложил
В bash задайте параметры glob, чтобы отсутствующие совпадения не вызывали ошибку:
shopt -u failglob # avoid failure report (and discarding the whole line).
shopt -s nullglob # remove (erase) non-matching globs.
ls ?c c?
Вопросительный знак -— это символ-шаблон, представляющий один символ. Поскольку вам нужны имена файлов с двумя символами -, одно из них должно быть c
, поэтому это либо первый символ, либо последний символ.
С помощью shopt -s dotglob
это также приведет к появлению файла с именем .c
.
Если соответствующих файлов нет, установка этих параметров оболочки приводит к удалению всех аргументов, в результате чего по умолчаниюls
--отображается пустой список всего/всего.
Вместо этого используйте это:
shopt -s nullglob ## drop any missing globs
set -- ?c c? ## populate the $@ array with (any) matches
if [ $# -gt 0 ] ## if there are some, list them
ls -d "$@"
fi
Думаю, лучше использоватьfind
:
find. -type f -name '*c*' -name '??'
Это будет рекурсивный поиск. Чтобы перечислить только файлы в текущем каталоге:
find. ! -name. -prune -type f -name '*c*' -name '??'
Если файлы существуют (и не содержат экранированных символов, таких как \c
), вы можете использовать глобус:
echo ?c c?
, который будет соответствовать файлам, имеющим один символ (?
), за которым следует c
, или которые имеют c
, за которым следует один символ(?
).
Но произойдет сбой с именами файлов , которые начинаются с тире, например -n
или -e
, или с символами обратной косой черты, например \c
или \n
с echo
как -e
и -n
являются специальными для (некоторых оболочек)echo
и \c
или \n
будут интерпретироваться как управляющая последовательность(\c
завершает вывод и \n
печатает новую строку, а не дословные символы \n
в некоторых реализациях оболочки эха и с bash, когда установлен параметр shopt -s xpg_echo
). Другие приложения или утилиты (, такие как ls
), будут иметь некоторые другие параметры и могут дать сбой, если многие другие запущенные тире -или интерпретируют другие escape-символы в именах файлов.
Также дважды будет указан файл с именем cc
.
Если файл может начинаться с тире (, например -n ), используйте:
$ ls -d -- ?n
-n
Или, лучше:
$ ls -d./?n
./-n
Glob не соответствует ни одному файлу.
Если файлы не существуют, глобус не будет расширен, а глобус будет напечатан в исходном виде.
$ echo ?m m?
?m m?
Кроме зш.
$ zsh -c 'echo ?m m?'
zsh:1: no matches found:./m?
Оболочка завершится с ошибкой.
Это поведение контролируется параметром Zsh nomatch
.
$ zsh -c 'setopt +o nomatch; echo ?m m?'
?m m?
или:
$ zsh -c 'echo ?m(N) m?(N)'
?m m?
Но это напечатает mm
дважды.
В bash вы можете получить результат, аналогичный zsh, если установлена опция оболочки failglob
:
$ bash -c 'shopt -s failglob; echo ?m m?'
bash: no match: ?m
Но скрипт не остановится, оболочка не выйдет. Ну, технически строка, в которой используется глобус, дальше не выполняется, а выполнение возобновляется на следующей строке скрипта.
В bash можно установить параметр nullglob
для удаления несовпадающих глобусов:
$ bash -c 'shopt -s nullglob; echo ?m m? done'
done
Использование ls (аналогично другим программам)
С сопоставлением файлов проблем не будет, но также будут сопоставляться (и список )каталогов:
$ ls ?c c?
bc cz sc
ac:
hjk
Лучшее использование -d
сls
(каталогами будет включено, но не расширено ).
$ ls -d ?c c?
ac bc cz sc
Глобальные объекты не соответствуют файлу (или каталогу)
Затем ls
сообщит об ошибке
$ ls ?m m?
ls: cannot access '?m': No such file or directory
Другие программы могут (возможно )выполнять не аналогичные проверки.
Использование nullglob
с bash даст пустой список для ls, поэтому он отобразит содержимое или pwd, как если бы был выполнен только ls
:
$ ls ?m m?
ac a.out cz 3 b sc ab bc
Этого можно было бы избежать с помощью./
$ ls -d./?m./m?
ls: cannot access './?m': No such file or directory
ls: cannot access './m?': No such file or directory
Или вы можете использовать регулярное выражение поиска (, но оно будет проходить по подкаталогам с отсутствующими prune
)(Обратите внимание, что это не будет повторять файл с именем cc):
$ find. ! -name. -prune -regex '.*/\(.c\|c.\)'
./ac
./cc
./sc
./bc
./cz
bash
:Либо c
, за которым следует символ (?c
), либо символ (, включающий .
с dotglob
), за которым следуетc
(?c
).
shopt -s extglob failglob dotglob
printf '%s\n' @(?c|c?)
Все файлы, кроме тех, которые либо не содержат c
(!(*c*)
), либо не содержат двух символов(!(??)
). Здесь используется двойное -отрицание для достижения соединения.
shopt -s extglob failglob dotglob
printf '%s\n' !(!(*c*)|!(??))
zsh
:printf '%s\n' (?c|c?)(D)
(где D
включает dotglob
; failglob
(, называемый nomatch
в zsh
), по умолчанию включен там ).
двойное отрицание с использованием оператора~
кроме и ^
расширенных операторов отрицания:
set -o extendedglob
printf '%s\n' *c*~^??(D)
ksh93
:в ksh93 нет опции nomatch
/failglob
, но там можно сделать вручную:
FIGNORE='@(.|..)' # only ignore. and.. and not the other dotfiles
files=(~(N)@(?c|c?))
if ((${#files[@]})); then
printf '%s\n' "${files[@]}"
else
echo >&2 No match
exit 1
fi
(где ~(N)
включает nullglob
для этого шара ).
ksh93
имеет оператор конъюнкции. Так что здесь вы также можете изменить строку files=(...)
на:
files=(~(N)@(*c*&??))