Globbing شبیه به عبارتهای منظم (regular expressions) برای نام فایلها است. با اینکه مهارتی حیاتی در خط فرمان به شمار میآید، اغلب بهدرستی درک نمیشود. دانشی سطحی را میتوان به درک عمیق و کاربردی تبدیل کرد.
Globbing چیست؟
“Globbing” نسخهٔ غیررسمی اصطلاح «گسترش نام فایل» است. با استفاده از الگوهای خاص، میتوان فایلها را بر اساس الگو شناسایی کرد، نه بر اساس نام دقیق.
مثال ابتدایی:
ls *.txt
این دستور تمام فایلهایی با پسوند .txt در پوشهٔ جاری را نشان میدهد.
*میتواند هر رشتهای از کاراکترها را جایگزین کند، حتی رشتهٔ خالی.- فایلهای مانند
about.txtوa filename with spaces.txtتطبیق داده میشوند. - فایلهایی مانند
file.txt.gzیا.txtتطبیق نمیشوند.
فایلهای مخفی که با نقطه شروع میشوند، نیازمند این هستند که الگو با . آغاز شود.
سایر انواع تطبیق استاندارد:
?یک کاراکتر واحد را تطبیق میدهد.[ ... ]یک کاراکتر از مجموعهٔ مشخص یا رنج (مثلاً a-z) یا کلاس کاراکتر (مثلاً:digit:) را تطبیق میدهد.
با ترکیب این قوانین میتوان الگوهای پیچیده برای نیازهای متفاوت ساخت، مثل:
ls [amz]*[:digit:].??
که تمام فایلهایی را نشان میدهد که با a، m یا z شروع و با یک رقم و پسوند دو حرفی خاتمه مییابند.
گاهی الگوهای براکتدار مثل:
ls *.{md,markdown}
استفاده میشود تا تمام فایلها با یکی از پسوندهای مشخص شده را فهرست کند. این گسترش براکت جدا از globbing است اما معمولاً با آن ترکیب میشود.
Globbing چگونه کار میکند؟
مسئولیت globbing بر عهدهٔ shell است، نه دستور مورد استفاده.
بهعنوان مثال:
ls *.txt
- shell ابتدا
*.txtرا به فهرستی از فایلهای مطابق در پوشهٔ جاری تبدیل میکند (foo.txt, hello.txt, ...). - سپس این مقادیر به
lsداده میشوند.
مشکل رایج با find
find . -name *.txt
- Bash ابتدا
*.txtرا به لیست فایلها در پوشهٔ جاری تبدیل میکند. - دستور به شکل زیر اجرا میشود:
find . -name filea.txt fileb.txt filec.txt
findتنها یک آرگومان برای-nameمیپذیرد، بنابراین با خطای «unknown primary or operator» مواجه میشود.
راه درست:
find . -name '*.txt'
استفاده از کوتیشن باعث میشود shell گسترش نام فایل را انجام ندهد و الگو مستقیم به find داده شود.
قابلیتهای پیشرفتهٔ Globbing
در Bash، کاراکترهای اصلی *، ? و [ ... ] هستند. Bash همچنین از wildcardهای پیشرفته پشتیبانی میکند:
shopt -s extglob
نمونههای پیشرفته:
?(pattern-list)→ ۰ یا ۱ بار تطبیق*(pattern-list)→ ۰ یا بیشتر بار تطبیق+(pattern-list)→ ۱ یا بیشتر بار تطبیق@(pattern-list)→ دقیقاً ۱ بار تطبیق!(pattern-list)→ تطبیق همه به جز موارد مشخص شده
مثال:
+(a) # فایلهایی با نام a، aa، aaaaa
README?(.md|.txt) # README, README.md, README.txt
الگوها بهطور ضمنی anchored هستند؛ یعنی +(a) فقط فایلهایی را که دقیقا “a” هستند تطبیق میدهد، نه فایلهایی که حاوی “a” در وسط هستند.
تفاوت بین Shellها
- Bash و Zsh هر دو اصول پایه را پشتیبانی میکنند.
- Zsh امکانات پیشرفتهتری شبیه به عبارتهای منظم دارد (گروهبندی با پرانتز).
- بسیاری از Shellها امکان globbing بازگشتی دارند، مثلاً:
shopt -s globstar
ls **/*.txt
این دستور تمام فایلهای .txt در پوشهٔ جاری و زیرپوشهها را پیدا میکند.
جمعبندی
تسلط بر سینتکس پایهٔ POSIX: *، ? و [ ... ] برای مدیریت مؤثر فایلها کافی است. یادگیری سینتکس پیشرفتهٔ Shell انتخابی نیز مزیت کوچکی به همراه دارد و globbing را به ابزاری قدرتمند برای خط فرمان تبدیل میکند.











