Що означає. * * Означає команду shell?


22

Наступна команда буде tarвсе «точкові» файли і папки:

tar -zcvf dotfiles.tar.gz .??*

Мені знайомі регулярні вирази , але я не розумію, як інтерпретувати .??*. Я виконав ls .??*і tree .??*подивився на файли , які були перераховані. Чому цей регулярний вираз включає всі файли в папках, починаючи з, .наприклад,?


1
дивіться також unix.stackexchange.com/questions/1168/…
lesmana

Відповіді:


32

Глобуси - це не регулярні вирази. Загалом, оболонка намагатиметься інтерпретувати все, що ви вводите в командному рядку, що ви не цитуєте як глобус. Оболонки взагалі не потрібні для підтримки регулярних виразів (хоча насправді багато хто з більш модних сучасних, як, наприклад, =~оператор відповідності регулярних виразів у bash [[конструкції).

Це .??*- глобус. Він відповідає будь-якому імені файлу, що починається з буквальної крапки ., за яким слідують будь-які два (не обов'язково однакові) символи ??, за якими слід еквівалент регулярного вираження [^/]*, тобто 0 або більше символів, які не є /.

Щоб отримати докладні відомості про розширення імені шляху оболонки (повне ім'я для "глобалізації"), див. Специфікацію POSIX .


10
Додатковий момент: це спроба записати глобус, який відповідає всім точковим файлам у каталозі, крім спеціальних записів, .і з ..яким зазвичай нічого не хочеться робити. Це не зовсім правильно; він не вибирає нічого з назвою " .X", де X - якийсь символ, крім крапки. Я не думаю , що можна написати один Glob , який відповідає кожному dotfile крім .і .., але ви можете зробити це з двома: tar zcvf dotfiles.tar.gz .[!.] .??*наприклад.
zwol

@Zack: Дякую за пояснення. Я опублікував коментар з цього приводу, але потім видалив його. ls .?повернув те саме ls .., що означало, що в папці не було інших записів, що відповідають шаблону .?. Я б зробив .[^.]для всіх .?файлів, крім ...
SabreWolfy

2
@SabreWolfy Якщо ви уважно читаєте специфікацію POSIX, це насправді важлива різниця між глобусами та регулярними виразами: у дужкових виразах, [^abc]у синтаксисі regex означає те саме, що [!abc]у синтаксисі glob (тобто ^замінено !на глобуси). Використання [^abc]синтаксису стилів у глобусі не є дуже портативним, оскільки POSIX не вказує, що це означає, тому деякі оболонки інтерпретують його за допомогою семантики, подібної до регулярних виразів, а інші трактують ^як просто буквальний символ.
jw013

1
@ jw013: Дякую за деталі. Я повинен пам'ятати, що глобус! =
Regexp

1
Мені просто прийшло .[!.]в голову, що в tarкомандному рядку може бути залишений буквальний текст у загальному випадку, коли немає файлів, які б відповідали цьому шаблону. Деякі оболонки дозволяють вам контролювати таку поведінку, наприклад, з bash, shopt -s nullglobзмусить її зникнути з командного рядка, якщо він нічого не відповідає, але це не універсальна особливість.
zwol

8

.??*Символи ( НЕ регулярний вираз, хоча це виглядає саме так) переводить в імена файлів , які починаються з періоду ( .), а потім двома окремими символами ( ??), а потім будь-яке число (нуль або більше) інших символів ( *).

Можливо, ця сторінка на Wildcards у файлах буде корисною.


-1

Щоб додати до інших відповідей, один ?переведе на одне ім’я файлу символів і ??відповідатиме ім’ям файлів, які містять лише два символи тощо.

[root@mercy testdir_2]# ls
ion  it  r
[root@mercy  testdir_2]# ls ?
r
[root@mercy  testdir_2]# ls ??
it
[root@mercy 1 testdir_2]# ls ???
ion
[root@mercy  testdir_2]#

Downvoter, можете прокоментувати будь ласка? Буду радий виправитись, якщо я помиляюся.
Sree

Ваша відповідь не відповіла на питання повністю.
SabreWolfy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.