الگوهای تطبیق Glob را برای کشف و فیلتر کارآمد مسیرهای فایل کاوش کنید. سینتکس، بهترین شیوه ها و مثال های واقعی را برای زبان های برنامه نویسی و سیستم عامل های متنوع بیاموزید.
تطبیق الگوهای Glob: راهنمای جامع برای کشف و فیلتر کردن مسیرهای فایل
در دنیای توسعه نرم افزار و مدیریت سیستم، مدیریت و دستکاری کارآمد فایل ها یک نیاز اساسی است. تطبیق الگوهای Glob راهی قدرتمند و مختصر برای کشف و فیلتر کردن فایل ها بر اساس الگوهای مشخص شده ارائه می دهد. این مقاله به بررسی پیچیدگی های globbing، بررسی نحو، کاربرد و برنامه های آن در زبان های برنامه نویسی و سیستم عامل های مختلف می پردازد.
تطبیق الگوهای Glob چیست؟
Globbing، مخفف "global"، تکنیکی است که برای تطبیق نام فایل ها و مسیرهای دایرکتوری با استفاده از کاراکترهای wildcard استفاده می شود. بر خلاف عبارات منظم، که قابلیت های تطبیق الگوهای پیچیده تر و ظریف تری را ارائه می دهند، globbing بر تعاریف الگوی ساده و شهودی تمرکز دارد. این روش معمولاً در رابط های خط فرمان، اسکریپت های شل و زبان های برنامه نویسی برای شناسایی مجموعه ای از فایل ها یا دایرکتوری هایی که معیارهای خاصی را برآورده می کنند، استفاده می شود.
نحو اصلی Globbing
هسته اصلی تطبیق الگوهای glob در کاراکترهای wildcard آن نهفته است. این کاراکترها یک نماد اختصاری برای نمایش یک یا چند کاراکتر در نام فایل یا دایرکتوری ارائه می دهند. رایج ترین wildcardها عبارتند از:
*
(ستاره): با صفر یا بیشتر کاراکتر مطابقت دارد. به عنوان مثال،*.txt
با تمام فایل هایی که با ".txt" ختم می شوند، مطابقت دارد.?
(علامت سوال): دقیقاً با یک کاراکتر مطابقت دارد.file?.txt
با "file1.txt"، "file2.txt" مطابقت دارد، اما با "file12.txt" مطابقت ندارد.[]
(براکت های مربعی): با هر کاراکتر منفرد درون براکت ها مطابقت دارد.file[1-3].txt
با "file1.txt"، "file2.txt" و "file3.txt" مطابقت دارد. همچنین می توانید محدوده های کاراکتری مانند [a-z] یا [A-Z] را مشخص کنید.file[abc].txt
با "filea.txt"، "fileb.txt" و "filec.txt" مطابقت دارد.[^]
(Caret داخل براکت های مربعی): با هر کاراکتر منفردی که نه در داخل براکت ها باشد، مطابقت دارد.file[^1-3].txt
با "file4.txt"، "filea.txt" و غیره مطابقت دارد، اما با "file1.txt"، "file2.txt" یا "file3.txt" مطابقت ندارد.{}
(آکولاد - به طور جهانی پشتیبانی نمی شود): اجازه می دهد تا چندین جایگزین مشخص شوند.file{1,2,3}.txt
معادلfile1.txt file2.txt file3.txt
است. این می تواند برای الگوهای پیچیده تری مانندimage.{png,jpg,gif}
نیز استفاده شود.
این wildcardهای اصلی را می توان برای ایجاد الگوهای پیچیده تر ترکیب کرد. به عنوان مثال، *.log.*
با هر فایلی که با ".log" ختم می شود و به دنبال آن هر پسوند دیگری می آید، مطابقت دارد.
Globbing در زبان های برنامه نویسی مختلف
در حالی که مفاهیم اصلی globbing ثابت باقی می مانند، پیاده سازی ها و نحو خاص می توانند در زبان های برنامه نویسی مختلف کمی متفاوت باشند.
Python
پایتون ماژول glob
را برای کار با الگوهای glob ارائه می دهد.
import glob
# Find all .txt files in the current directory
txt_files = glob.glob("*.txt")
print(txt_files)
# Find all .jpg files in a subdirectory called 'images'
jpg_files = glob.glob("images/*.jpg")
print(jpg_files)
# Recursively find all .py files in the current directory and its subdirectories
py_files = glob.glob("**/*.py", recursive=True)
print(py_files)
تابع glob()
ماژول glob
یک الگوی glob را به عنوان ورودی می گیرد و لیستی از مسیرهای فایل مطابق را برمی گرداند. آرگومان recursive=True
اجازه می دهد تا زیر شاخه ها پیمایش شوند، ویژگی ای که در پایتون 3.5 معرفی شده است.
مثال: فایل های بین المللی سازی (i18n)
یک پروژه با فایل های ترجمه سازماندهی شده بر اساس کد زبان، به عنوان مثال، en.json
، fr.json
، de.json
را تصور کنید. برای یافتن تمام فایل های ترجمه، می توانید از: glob.glob("*.json")
استفاده کنید. این به صورت سراسری کار می کند، صرف نظر از کدهای زبان خاص مورد استفاده در نام فایل ها.
JavaScript (Node.js)
در Node.js، بسته glob
(موجود از طریق npm) قابلیت های globbing را ارائه می دهد.
const glob = require("glob");
// Find all .js files in the 'src' directory
glob("src/**/*.js", (err, files) => {
if (err) {
console.error(err);
return;
}
console.log(files);
});
تابع glob()
در Node.js ناهمزمان است و یک تابع callback را می گیرد که یک شیء خطا و یک آرایه از مسیرهای فایل مطابق را دریافت می کند. الگوی src/**/*.js
به طور بازگشتی تمام فایل های .js
را در داخل دایرکتوری src
و زیر شاخه های آن جستجو می کند.
مثال: یافتن فایل های پیکربندی
بسیاری از پروژه های جاوا اسکریپت از فایل های پیکربندی مانند .eslintrc.js
یا webpack.config.js
استفاده می کنند. می توانید از glob برای یافتن سریع این فایل ها استفاده کنید: glob("*.config.js")
.
Java
Java 7 بسته java.nio.file
را معرفی کرد که شامل پشتیبانی از globbing از طریق متد FileSystem.getPathMatcher()
است.
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class GlobExample {
public static void main(String[] args) throws IOException {
Path startingDir = Paths.get(".");
String pattern = "glob:**/*.java"; // Recursive search for Java files
PathMatcher matcher = FileSystems.getDefault().getPathMatcher(pattern);
Files.walkFileTree(startingDir, new SimpleFileVisitor() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (matcher.matches(file)) {
System.out.println("Found: " + file);
}
return FileVisitResult.CONTINUE;
}
});
}
}
این مثال از Files.walkFileTree()
برای پیمایش سیستم فایل و PathMatcher
برای بررسی اینکه آیا هر فایل با الگوی glob مشخص شده مطابقت دارد یا خیر، استفاده می کند. الگوی glob:**/*.java
به طور بازگشتی تمام فایل های .java
را جستجو می کند.
مثال: بارگیری فایل های پلاگین
یک برنامه جاوا را تصور کنید که پلاگین ها را از یک دایرکتوری خاص بارگیری می کند. Globbing می تواند برای یافتن تمام فایل های JAR در دایرکتوری پلاگین استفاده شود: glob:plugins/*.jar
.
Shell Scripting (Bash)
Globbing به طور عمیقی در زبان های اسکریپت نویسی شل مانند Bash ادغام شده است.
#!/bin/bash
# Find all .txt files in the current directory
for file in *.txt;
do
echo "Found file: $file"
done
# Find all files starting with 'report' in the 'logs' directory
for file in logs/report*;
do
echo "Found report: $file"
done
#Recursively find all files ending in '.conf'
shopt -s globstar #Enable globstar
for file in **/*.conf;
do
echo "Found conf file: $file"
done
در Bash، الگوهای glob به طور مستقیم توسط شل قبل از اجرای دستور گسترش می یابند. گزینه globstar
(shopt -s globstar
) globbing بازگشتی را با الگوی **
فعال می کند.
مثال: اسکریپت های مدیریت سیستم مدیران سیستم اغلب از globbing در اسکریپت ها برای مدیریت فایل های گزارش، فایل های پیکربندی یا سایر منابع سیستم استفاده می کنند. به عنوان مثال، حذف تمام فایل های موقت قدیمی تر از یک تاریخ معین ممکن است شامل globbing برای شناسایی فایل های مربوطه باشد.
تکنیک های پیشرفته Globbing
Extended Globbing (Bash)
Bash ویژگی های globbing توسعه یافته ای را ارائه می دهد که قابلیت های تطبیق الگوی قدرتمندتری را ارائه می دهند. این ویژگی ها باید با استفاده از دستور shopt
فعال شوند.
#!/bin/bash
shopt -s extglob # Enable extended globbing
# Match files that end in .txt but are NOT named 'important.txt'
for file in !(important).txt;
do
echo "Found file: $file"
done
# Match files that start with 'data' followed by one or more digits
for file in data+([0-9]).txt;
do
echo "Found file: $file"
done
برخی از الگوهای مفید globbing توسعه یافته:
?(pattern)
: با صفر یا یک وقوع الگو مطابقت دارد.*(pattern)
: با صفر یا بیشتر وقوع الگو مطابقت دارد.+(pattern)
: با یک یا چند وقوع الگو مطابقت دارد.@(pattern1|pattern2|pattern3)
: با یکی از الگوهای مشخص شده مطابقت دارد.!(pattern)
: با هر چیزی به جز الگوی مشخص شده مطابقت دارد.
ترکیب Globbing با ابزارهای دیگر
Globbing می تواند به طور یکپارچه با سایر ابزارهای خط فرمان ادغام شود تا وظایف پیچیده تر دستکاری فایل را انجام دهد.
# Find all .txt files and pipe the list to grep to search for the word 'error'
ls *.txt | grep "error"
# Use find with globbing to delete all .tmp files older than 7 days
find . -name "*.tmp" -mtime +7 -delete
اولین مثال از ls
برای لیست کردن تمام فایل های .txt
استفاده می کند و سپس خروجی را به grep
می فرستد تا خطوط حاوی کلمه "error" را جستجو کند. مثال دوم از find
با گزینه -name
برای پیدا کردن تمام فایل های .tmp
و گزینه -mtime
برای فیلتر کردن فایل های قدیمی تر از 7 روز قبل از حذف آنها استفاده می کند.
Globbing در مقابل عبارات منظم
در حالی که هم globbing و هم عبارات منظم برای تطبیق الگو استفاده می شوند، اما از نظر پیچیدگی و قابلیت ها تفاوت های قابل توجهی دارند.
Globbing:
- نحو ساده و شهودی.
- در درجه اول برای تطبیق نام فایل استفاده می شود.
- مجموعه محدودی از کاراکترهای wildcard.
- اجرای سریعتر برای الگوهای ساده.
عبارات منظم:
- نحو پیچیده تر با طیف گسترده تری از metacharacterها و quantifiers.
- می تواند برای تطبیق الگوها در هر متنی، نه فقط نام فایل ها استفاده شود.
- قدرتمند و انعطاف پذیر برای سناریوهای پیچیده تطبیق الگو.
- می تواند به دلیل سربار موتور عبارت منظم، برای الگوهای ساده کندتر از globbing باشد.
به طور کلی، globbing برای وظایف ساده تطبیق نام فایل مناسب است، در حالی که عبارات منظم برای پردازش متن پیچیده تر و سناریوهای تطبیق الگو مناسب تر هستند.
بهترین شیوه ها برای استفاده از تطبیق الگوهای Glob
- خاص باشید: از الگوهای بیش از حد گسترده ای که ممکن است با فایل های ناخواسته مطابقت داشته باشند، اجتناب کنید. به عنوان مثال، به جای
*
، از*.txt
برای هدف قرار دادن فقط فایل های متنی استفاده کنید. - از بازگشت به دقت استفاده کنید: Globbing بازگشتی (به عنوان مثال،
**/*
) می تواند از نظر منابع فشرده باشد، به خصوص در ساختارهای دایرکتوری بزرگ. قبل از استفاده از الگوهای بازگشتی، پیامدهای عملکرد را در نظر بگیرید. - الگوهای خود را تست کنید: قبل از اجرای دستوراتی که فایل ها را بر اساس الگوهای glob تغییر یا حذف می کنند، الگوها را تست کنید تا مطمئن شوید که با فایل های مورد نظر مطابقت دارند. از
ls
یاecho
برای پیش نمایش نتایج استفاده کنید. - تفاوت های خاص پلتفرم را درک کنید: از تغییرات ظریف در پیاده سازی های globbing در سیستم عامل ها و شل های مختلف آگاه باشید. به عنوان مثال، حساسیت به حروف بزرگ و کوچک ممکن است متفاوت باشد.
- کاراکترهای ویژه را Escape کنید: اگر نیاز به تطبیق یک کاراکتر wildcard تحت اللفظی (به عنوان مثال، یک ستاره) دارید، آن را با استفاده از یک بک اسلش (
\*
) Escape کنید.
مثال ها و موارد استفاده در دنیای واقعی
- توسعه وب: یافتن تمام فایل های تصویر (
.jpg
،.png
،.gif
) در یک دایرکتوری دارایی برای بهینه سازی. - تحلیل داده: پردازش یک سری از فایل های گزارش با نام هایی مانند
data_2023-10-26.log
،data_2023-10-27.log
و غیره. - مدیریت سیستم: چرخش فایل های گزارش با شناسایی و بایگانی فایل های قدیمی تر از یک تاریخ خاص.
- اتوماسیون ساخت: شامل یا حذف فایل ها یا دایرکتوری های خاص در طول فرآیند ساخت.
- تولید کد: یافتن فایل های الگو برای تولید کد بر اساس الگوهای خاص.
- مدیریت پیکربندی: یافتن تمام فایل های پیکربندی در یک دایرکتوری پروژه.
ملاحظات امنیتی
هنگام استفاده از globbing، توجه به خطرات امنیتی بالقوه بسیار مهم است. اگر از ورودی کاربر برای ساخت الگوهای glob استفاده شود، می تواند منجر به دسترسی یا تغییر ناخواسته فایل شود. برای کاهش این خطرات:
- ورودی کاربر را Sanitize کنید: همیشه ورودی کاربر را قبل از استفاده از آن در الگوهای glob اعتبارسنجی و Sanitize کنید تا از الگوهای مخرب جلوگیری شود.
- دسترسی را محدود کنید: اطمینان حاصل کنید که فرآیند اجرای عملیات globbing کمترین امتیاز لازم برای دسترسی و تغییر فایل ها را دارد.
- از جایگزین های ایمن استفاده کنید: در شرایطی که امنیت از اهمیت بالایی برخوردار است، به جای تکیه صرف بر globbing، استفاده از API های سیستم فایل کنترل شده تر را در نظر بگیرید.
نتیجه گیری
تطبیق الگوهای Glob یک ابزار قدرتمند و همه کاره برای کشف و فیلتر کردن مسیر فایل است. نحو ساده و در دسترس بودن گسترده آن، آن را به یک مهارت ضروری برای توسعه دهندگان، مدیران سیستم و هر کسی که با فایل ها و دایرکتوری ها کار می کند تبدیل کرده است. با درک مفاهیم اصلی، تغییرات نحوی و بهترین شیوه ها، می توانید از globbing برای ساده کردن گردش کار خود و خودکارسازی موثر وظایف مدیریت فایل استفاده کنید. چه در حال نوشتن اسکریپت های شل باشید، چه در حال توسعه برنامه ها یا مدیریت سرورها، globbing راهی مختصر و کارآمد برای تعامل با سیستم فایل ارائه می دهد.