Bash расширенный globbing

GNU date утилита берет много различных форматов даты и времени. Легкий, чтобы использовать и помнить является ISO8601. Вот пример:

date -s '2013-09-18 07:15:00'

Можно хотеть рассмотреть использование NTP и изменение Вашего часового пояса вместо этого.

3
19.11.2014, 04:43
2 ответа

Bash не имеют никакой функции для расширения всего одного соответствия из многих.

образец (нечто) соответствия всего одно возникновение из образца нечто . Таким образом, это соответствует нечто , но не foofoo. Эта синтаксическая форма полезна для сборки или узоров как (foo|bar) , который соответствует или нечто или панель . Это может использоваться в качестве части более длинных узоров как (foo|bar) -*.txt , который соответствует foo-hello.txt , foo-42.txt , bar-42.txt , и т.д.

, Если вы хотите использовать одно соответствие среди многих, можно поместить соответствия в массив и затем использовать элемент массива.

kernels=(vmlinuz*)
ls -l "${kernels[0]}"

Соответствия всегда сортируются в лексикографическом порядке, таким образом, это распечатает первое соответствие в лексикографическом порядке.

Примечание, что, если образец не соответствует никакому файлу, вы получите массив, содержащий единственный элемент, который является неизменным образцом:

$ a=(doesnotmatchanything*)
$ ls -l "${a[0]}"
ls: cannot access doesnotmatchanything*: No such file or directory

Набор опция nullglob получить пустой массив вместо этого.

shopt -s nullglob
kernels=(vmlinuz*)
if ((${#kernels[@]} == 0)); then
  echo "No kernels here"
else
  echo "One of the ${#kernels[@]} kernels is ${kernels[0]}"
fi

Zsh имеет удобные функции здесь. спецификатор шарика [ ЦИФРА ] причины образец для расширения только до соответствия NUMth; вариант [ NUM1, NUM2] расширяется до NUM1th через соответствия NUM2th (запускающийся в 1).

% ls -l vmlinuz*([1])
lrwxrwxrwx 1 root root 26 Nov 15 21:12 vmlinuz -> vmlinuz-3.16-0.bpo.3-amd64
% ls -l nosuchfilehere*([1])
zsh: no matches found: nosuchfilehere*([1])

Спецификатор шарика N заставляет образец расширяться до пустого списка, если никакой файл не подобран.

kernels=(vmlinuz*(N))
if ((#kernels)); then
  ls -l $kernels
else
  echo "No kernels here"
fi

спецификатор шарика ом соответствия видов путем увеличения возраста вместо по имени ( m в течение времени изменения); Ом виды путем уменьшения возраста. Так vmlinuz* (ом [1]) расширяется до нового файла ядра.

2
27.01.2020, 21:16

"одно соответствие" не означают то, что вы думаете, что оно делает. Это означает одно соответствие в образце , чтобы не только возвратить один файл. ls не имеет никаких опций как этот. Обычно, люди делают вещи как ls |head-1 или подобный.

3
27.01.2020, 21:16

Теги

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