טיפ Bash: גלובינג רקורסיבי
19/10/2018
יש לכם bash גירסא 4? גם אתם יכולים להשתמש ב globstar שיגרום לתבניות הגלוב שלכם לתפוס יותר קבצים. בואו נראה מה זה ואיך מפעילים.
1. מה זה גלובינג רקורסיבי
נניח שיש לכם את מבנה הקבצים והתיקיות הבא:
.
├── doc
│ └── readme.txt
├── lib
│ └── demo.c
└── src
├── common
│ └── utils.c
└── main.c
ואתם רוצים רשימה של פרטי כל הקבצים שמסתיימים ב .c
. עד לא מזמן find היתה האופציה הטובה ביותר שלכם, מאחר ואתם לא יודעים באיזה תיקיות קבצים אלה מסתתרים.
גירסא 4 של Bash הוסיפה תמיכה בסימן **
בתבניות שמות קבצים. זה ההסבר על הסימן מתוך man bash:
globstar If set, the pattern ** used in a pathname expansion context will match all files and zero or more directories and subdirectories. If the pattern is followed by a /, only directories and subdirectories match.
או בקיצור הסימן מתאים לחיפוש עומק בתיקיות והוא מייצג רצף של תיקיה בתוך תיקיה בתוך תיקיה לכל עומק אפשרי.
בדוגמא שלנו כדי לקבל את רשימת כל קבצי ה c נפעיל:
$ ls -l **/*.c
-rw-r--r-- 1 ynonperek staff 0 Oct 18 20:41 lib/demo.c
-rw-r--r-- 1 ynonperek staff 0 Oct 18 20:41 src/common/utils.c
-rw-r--r-- 1 ynonperek staff 0 Oct 18 20:41 src/main.c
2. למה זה לא עובד אצלי
לפני שאתם רצים לשלב גלוב רקורסיבי בסקריפטים שלכם יש לוודא שני דברים:
- אתם עובדים על Bash גירסא 4 או חדשה יותר. אפשר לבדוק את הגירסא עם:
$ echo $BASH_VERSION
- יש להפעיל את התמיכה באפשרות globstar כדי לא לשבור סקריפטים ישנים. אם אתם ב Shell אינטרקטיבי פשוט כותבים:
$ shopt -s globstar